数组变量和指针的关系

老师说数组变量可以被看作是const的指针变量,到底是“可以被看作”,还是“就是”指针呢?

用程序证据来说明你的观点。

(提示:如果对const指针的所有的操作都可以对数组变量做,而且结果一致,就说明数组变量就是指针;如果有某个操作不能做,或者结果不一致,就说明不是指针)

#include <stdio.h>int main(){int a[] = {1,1,2,3,4,5,6,7,8,9,0,};int *const p = &a[0];printf(“sizeof(a) = %d , sizeof(p) = %d \n”,sizeof(a) , sizeof(p));//sizeof(a)显示为44,是数组整个的一个长度,sizeof(p)显示为8; 是指针的长度printf(“main:p = %p\n”,p);printf(“main:a = %p\n”,a);//在主函数中仍然是数组的首地址a[13] = 10;printf(“main:a[13] = %d\n”,a[13]);p[13] = 10;printf(“main:p[13] = %d\n”,p[13]);//在主函数中都可以顺利执行sum(a , 11);}int sum(int a[],int len){int sum = 0;int i = 0;int *const p = &a[0];a = &a[0]; //[Error] ‘a’ redeclared as different kind of symbol (a 重新声明为不同类型的符号)// int *const p = &a[0]; //[Error] redefinition of ‘p’(p重复定义)//上面两个提示的是不同的错误, 说明数组参数实际上不是常量指针这个类型// int * a = &a[0]; 26 //[Error] ‘a’ redeclared as different kind of symbol// int *const p = &a[0]; //[Error] redefinition of ‘p’//说明数组参数也不是指针printf(“p = %p\n”,p);printf(“a = %p\n”,a);//他两指向的是一个数组p[1] = 10;printf(“p[1] = %d\n”,p[1]);a[1] = 10;printf(“a[1] = %d\n”,a[1]);//上面无论执行哪个都是一样的,而且都可执行,,这说明在修改变量,访问变量上是相同的a[13] = 10;printf(“a[13] = %d\n”,a[13]);p[13] = 10;printf(“p[13] = %d\n”,p[13]);//这说明a也并没有存储关于他的长度的信息,它仅仅是一个地址,和p一样,两个都没有警告,可以编译出相同的结果for(i = 0;i < len;i++){sum += a[i];}printf(“sizeof(a) = %d \n”,sizeof(a) );//通过编译看以看到sizeof(a)仍然是8,从这点看,传递的数组参数确实和常量指针一样return sum;}//从上面的测试来看,当数组变量作为参数时,它不是严格意义上的指针,更不是常量指针,但是他可以被看做指针,而且常量指针的操作都可以作用于数组变量//当数组变量不是参数时,即它在主函数中,它有两层含义 ,在用在sizeof上时,它似乎被看做了一个数组整体,但是其他情况下,都可以被当做常量指针。

转动心中的期待,血在澎湃,吃苦流汗算什么。

数组变量和指针的关系

相关文章:

你感兴趣的文章:

标签云: