结论:数组变量可以被看作是const的指针变量
(提示:如果对const指针的所有的操作都可以对数组变量做,而且结果一致,就说明数组变量就是指针;如果有某个操作不能做,或者结果不一致,就说明不是指针)
验证的程序表明对const指针的sizeof 操作和对数组变量的sizeof 操作并不一致
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *k = NULL;
printf("sizeof k = %d\n",sizeof(k));
printf("sizeof &k = %d\n",sizeof(&k));
// 32位架构下都应输出 4
printf("--------------------------\n");
int n = 0;
int a[5] = {0,1,2,3,4};
//令一个常量指针指向数组a
int * const p = a;
/*
//定义了一个常量指针并动态申请5个int大小的内存空间
int * const p = (int *)malloc( 5*sizeof(int) );
for(int i = 0; i < 5; i++){
p[i] = i;
}
//上面做的是:尽可能地构造了两个相同的数据结构
*/
printf("a's address = %p p's address %p\n",a,p); //两者指向相同的地址
printf("a[1]=%d p[1]=%d\n",a[1],p[1]); //相同之处 都可以通过数组下标访问
*a = 25;
printf("*a=%d\n",*a); //* 可以对指针做 也可以对数组做
//在下面我们将探讨性地发现 * const p 和 a[] 的不同之处
printf("sizeof(a)=%d\n",sizeof(a));
printf("sizeof(p)=%d\n",sizeof(p));
printf("sizeof(&p) = %d\n",sizeof(&p));
/* 个人根据所学 推测一下 sizeof(a) 和 sizeof(p) 不同的原因:(不能保证正确)
因为数组所指向的地址是连续的,(即数组可以随机寻址), 当使用sizeof 对数组a进行计算时 整个数组都会被计算进去
所以在32位架构下,sizeof(a) == sizeof( sizeof(int) * 5) == 20;
而指针所指向的存储空间可以是不连续的(本例中指针所指向的空间是连续的),
当使用sizeof 对常量指针p进行计算时 就等同于对常量指针p的地址进行sizeof计算 即 sizeof(p) == sizeof(&p)
在32位架构下 所以 sizeof(p) == sizeof(&p) == 4
*/
printf("-----------------------------\n");
//综上 可以得出const的指针和数组还是有区别的
//数组可以被看作const的指针
//于我认为,数组应该是特殊的 const 指针
return 0;
}
以上是在翁恺老师的”C语言程序设计进阶”中学习以及综合了讨论区同学的观点总结出来了。如有侵犯你的权益,请和我联系,谢谢。