用指针返回一个数组。大家帮我看看错在哪里。
很简单的常识性的程序,结果提示出错。大家帮我看看啊。
void main()
{
int i;
int *pp;
int a[5],b[5],c[5];
a[0]=1;
a[1]=3;
a[2]=5;
a[3]=7;
a[4]=2;
b[0]=4;
b[1]=5;
b[2]=2;
b[3]=8;
b[4]=7;
int * add(int,int ,int );
c=add(a[5],b[5],5);
for(i=0;i<5;i++)
cout<<c[i]<<endl;
}
int * add(int s[],int l[],int n)
{
int *d;
int i;
for(i=0;i<n;i++)
{
d[i]=s[i]+l[i];
}
return d;
}
出错的行:c=add(a[5],b[5],5);
error C2440: “=”: 无法从“int *”转换为“int [5]”
大家帮我看看,好久不用指针了。。。。
用引用也出错,就用指针。
其实我只是想调用函数并返回一个数组。但不会。后来用这个小程序试试,结果还出错了,郁闷
[解决办法]
c不是数组名吗?相当于常指针,不是左值怎么能给c赋值呢?你非要返回一个数组给c,只能将c作为参数传进去。
比如 void add(int, int, int, int *);
[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
提醒:
“学习用汇编语言写程序”
和
“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
不要写连自己也预测不了结果的代码!
[解决办法]
#include <iostream>using namespace std;int * add(int *,int * ,int );//是指针类型;void main(){ int i; //int *pp; //int a[5],b[5],c[5]; //注意定义问题 int a[5],b[5]; int *c; a[0]=1; a[1]=3; a[2]=5; a[3]=7; a[4]=2; b[0]=4; b[1]=5; b[2]=2; b[3]=8; b[4]=7; //int * add(int,int ,int ); //注意数据类型 c=add(a,b,5); for(i=0;i<5;i++) cout<<c[i]<<endl; //free(c);//释放内存}int * add(int s[],int l[],int n){ //int *d; int *d=(int *)malloc (sizeof(int)*n);//申请内存; int i; for(i=0;i<n;i++) { d[i]=s[i]+l[i]; } return d;}//给你都注释好了
[解决办法]