老师说数组变量可以被看作是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];
// int *const 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上时,它似乎被看做了一个数组整体,但是其他情况下,都可以被当做常量指针。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/cuiwjava/article/details/47074315