放弃"指针常量"这种不严谨的中文描述!深度理解数组名、指针常量
ques1: 数组名完全等价于指针常量吗?
int array[10] = { 10,11,12,13,14,15 };
printf("sizeof(array)= %d \n", sizeof(array));
char* const str_2 = "QQQQQQQQQQQQQQ";
printf("sizeof(str_2)= %ld \n", sizeof(str_2));
// 此实验说明虽然数组名的实现 和 指针常量(例如char* const p)很类似, 但在编译器眼里,仍然是有区别的:
// sizeof(数组名)等于数组大小, 而sizeof(指针常量)等于4字节(32位平台)或8字节(64位平台)
// 知道这个区别就行,下次和别人聊天,不要把数组名完全等价为指针常量。
ques2: C语言的指针常量,是真常量吗?
char** pp = (char**)(&str_2);
char data = 'c';
*pp = &data;
printf("str_2 = %c \n", str_2[0]);
//实测,指针str_2的指向可以被修改,所以在C语言中,中文表达的所谓“指针常量”这个称呼并不准确。
//C语言内的常量只有字面常量和枚举值。 ( PS:注意,要区分 枚举值 和 枚举变量(注意,要区分 枚举值 和 枚举类型定义的变量 ) )
指针常量和常量指针,这俩中文表述其实并不严谨。但是也有方法来理解其意思。
所谓指针常量,侧重点是常量,int* const p,p就是这里所谓的常量。
所谓常量指针,侧重点是个指针,const int* p;
很显然,数组名更贴近 int* const p, 绝对不是const int* p,所以更贴近指针常量的称呼。
但是需要补充:
1. 在C语言中,中文表达的所谓“指针常量”这个称呼并不准确,指针常量,并不是常量。
C语言内的常量只有字面常量和枚举值(注意,要区分 枚举值 和 枚举类型定义的变量 )。
2.数组名并不完全等价于指针常量。依据: sizeof(数组名)等于数组大小, 而sizeof(指针常量)等于4字节(32位平台)或8字节(64位平台)
小结:
放弃"指针常量"这种看似精简实则简陋的中文描述吧!
我们应该使用英文来描述:
Pointer to constant:
const int *ptr;
int const *ptr;W
Constant pointer to variable:
int *const ptr;
constant pointer to constant:
const int *const ptr;