void sum(int a[]) {a[0]=a[-1]+a[1];} main() {int a[10]={1,2,

问题描述:

void sum(int a[]) {a[0]=a[-1]+a[1];} main() {int a[10]={1,2,3,4,5,6,7,8,9,10}; sum(&a[2]); printf(
"%d\n",a[2]);
}
1个回答 分类:综合 2014-10-13

问题解答:

我来补答
你sum函数中数组的下表怎么可能为负数呢,下标越界会是程序崩溃,而且,你传给sun的参数&a[2],会把数组前两个丢掉,之所以程序仍然可以运行,是因为a[-1]其实是原数组的第二个【传递的数组看似越界,其实元数组没有,因为内存中的东西还在】,也就是2,a[1]是原数组的4,所以结果为6.
但是这样所貌似有点投机的意思,可以用来理解数组,但是实际做题是最好如此,
再问: 你的答案是对的,不过我还有好多疑问。如调用函数时是数组a[]型的,但在main中为什么变成取地址型的
再答: 先改一下:不小心打错了,上种语句实际中最好不用,不是最好如此 如调用函数时是数组a[]型的,但在main中为什么变成取地址型的 【先纠正一下,在c语言中没有引用的概念,c++中才有】 如果把数组当参数传递的话,那么就是传递的数组的首地址,即就“类似”指针,这个此不知用的恰当不,你可以看一下这段代码: int A[4]={1,1,1,1}; sizeof(A)=4*4=16(一个int是4个字节),但是如果把A当参数传递: int func(int A[4]) { sizeof(A)=4【这里是对指针求大小,在window 32位机子上一个指针是32位大小】 main函数的参数是 main(int argc, char *argv[ ]);main函数是系统执行相就的程序得到“调用”,从系统命令行中得到相应的参数。 “但在main中为什么变成取地址型的”这句话没看明白,能否解释清楚一下
再问: 先谢谢了,就是两个sum中函数类型不同,为什么一个是int型,而另一个是&a[2]型的。调用时函数类型不是必须相同的吗?
再答: 明白了【强调,类型必须一样,或者可以隐式转换】。你看: void sum(int a[]) {a[0]=a[-1]+a[1];}【要求的参数是数组,请记住,把数组当做参数传递的时候,其实就是传递的是数组的首地址,也可以理解为指向数组首地址的指针】 这是调用语句: sum(&a[2]); 【看,这里给函数传递的是数组a的地址,但是传的是第三个元素的地址,因为数组在内存中是按线性顺序分配空间的,所以,当sum函数执行的时候,输出的是从第3个元素开的,因为只是输出,原数组的第二个和第四个元素,所以没有问题,你可以试着在sum函数中输出所有元素,你就会发现最后的2个元素的值是混乱的】
 
 
展开全文阅读
剩余:2000
上一页:求补英语