本帖最后由 mxwawaawxm 于 2020-8-20 20:58 编辑
第1个问题
之前看视频看到const关键词和指针的位置,各有代表的意思[C] 纯文本查看 复制代码 int a=9, b=10;
int const *p1 = &a;
const int *p1 = &a;
以上的写法,const写在*前面,表示不能通过解引用指针来改变指针指向的变量的值
[C] 纯文本查看 复制代码 int a=9, b=10;
int * const p2 = &a;
这种写法,const写在*后面,代表指针是常量,不能修改指针变量的值
接下来,const关键词跟数组联系起来,比如
[C] 纯文本查看 复制代码 const int num[] = {1, 2, 3};
这样表示数组内的元素都是常量,不能修改值
再接着,字符串数组就出现问题了,比如,
[C] 纯文本查看 复制代码 const char *str1[] = {"ab", "cd", "ef"};
const char *str2 = "gh";
*str1 = str2;
printf("%s\n", *str1);
这里的数组str1,存放了3个char *指针。结果数组里的元素---指针可以改变值。
这里的const代表的是不能更改这三个字符串"ab", "cd", "ef"
同样加了const关键词,这怎么看起来好像跟int数组的规律不一样了。上面数组的元素不能修改值,这里却可以改变值
那么const关键词在*号前和后,如何理解呢
第2个问题
顺着上面的想法,弄一个字符串的二维数组
[C] 纯文本查看 复制代码 const char *str3[][2] = {
{"ab", "cd"}, {"ef", "gh"}
};
const char *str4[] = {"xy", "za"};
*str3 = str4;
结果这样又报错了error: assignment to expression with array type
上面的字符串一维数组,加了const,可以改变里面的元素指针的值
到这里字符串二维数组,也加了const,结果不能更改里面的元素一维数组
str4是一个二级指针
而str3[0][0]是char *指针
str3[0]也是char *指针的指针,也即二级指针
另外,str3存放str3[0]的地址,这样推下去str3是三级指针const char ***
但最后编译时,却一定得把str3的类型理解为const char * (*)[3]
我的理解哪里错了,请大侠们指导 |