C语言指针与const关键词
本帖最后由 mxwawaawxm 于 2020-8-20 20:58 编辑第1个问题
之前看视频看到const关键词和指针的位置,各有代表的意思 int a=9, b=10;
int const *p1 = &a;
const int *p1 = &a;
以上的写法,const写在*前面,表示不能通过解引用指针来改变指针指向的变量的值
int a=9, b=10;
int * const p2 = &a;
这种写法,const写在*后面,代表指针是常量,不能修改指针变量的值
接下来,const关键词跟数组联系起来,比如
const int num[] = {1, 2, 3};
这样表示数组内的元素都是常量,不能修改值
再接着,字符串数组就出现问题了,比如,
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数组的规律不一样了。上面数组的元素不能修改值,这里却可以改变值{:301_985:}
那么const关键词在*号前和后,如何理解呢{:301_985:}
第2个问题
顺着上面的想法,弄一个字符串的二维数组
const char *str3[] = {
{"ab", "cd"}, {"ef", "gh"}
};
const char *str4[] = {"xy", "za"};
*str3 = str4;
结果这样又报错了error: assignment to expression with array type
上面的字符串一维数组,加了const,可以改变里面的元素指针的值
到这里字符串二维数组,也加了const,结果不能更改里面的元素一维数组
str4是一个二级指针
而str3是char *指针
str3也是char *指针的指针,也即二级指针
另外,str3存放str3的地址,这样推下去str3是三级指针const char ***{:301_985:}
但最后编译时,却一定得把str3的类型理解为const char * (*)
我的理解哪里错了,请大侠们指导{:301_985:} const好像有一个顶层const和底层const! 二级指针变量 不是应该char** str吗? 我选择不const也不static 110006600 发表于 2020-8-19 12:11
二级指针变量 不是应该char** str吗?
const char *str4[] = {"xy", "za"};
数组不是数组首元素的地址吗
那str4的类型就应该是const char **吗{:301_985:} mxwawaawxm 发表于 2020-8-19 12:47
const char *str4[] = {"xy", "za"};
数组不是数组首元素的地址吗
那str4的类型就应该是const char ** ...
我也不懂,还回给老师了!还望大佬来解答,我认为定义const是不可变吧? 百度:在C语言中,const变量只不过是修饰该变量名,它并不能使内存变为只读。也就是说,块我们不能通过变量名再去操作这内存。但是可以通过其它方法,如指针,通过指针是可以修改被const修饰的那块内存的。
我记得数组好像不能直接赋值啊,会报错啊 int a = 10;
int b = 20;
int* const p = &a;//指针常量 常量可以改 p = &a是因为要把a的地址给指针p保存
//int* const temp;(错误)//指针常量 常量可以改 但是必须要有一个明确地址给指针,如果指针不明确等于没有指定地址保存常量的东西 所以必须有指定地址给指针 int* const temp = 数据地址
*p = b;
cout << *p << endl;
const int* p2;//常量指针 指针可以改可以选择定义指针的时候 确定指针保存的地址 或 不确定
//const int* temp2;(正确)//常量指针 指针可以改 可以不需要明确指定地址给指针 因为确认了指针都是可以变化的,所以有明确地址给指针保存毫无意义
p2 = &b;
cout << *p2 << endl;
const int* const p3 = &a;//const修饰指针同时修饰常量 指针常量都不可改 p3 = &a是因为要把a的地址给指针p3保存
//const int* const temp3;(错误)//const修饰指针同时修饰常量 指针常量都不可改 都是明确指定的指针和常量,所以必须有指定地址给指针const int* const temp3 = 数据地址
p3 = &b;
cout << *p3 << endl; 白糅绾 发表于 2020-8-19 13:43
int a = 10;
int b = 20;
谢谢。不过你这个回答也跟我上半部分的描述差不多
int* const p,p指针不能修改值
const int* p2或者int const* p2,表示不能通过解引用指针p来修改指向的变量的值
但我的疑问是,const与数组、字符指针数组结合的情况
const int num[] = {1, 2, 3};
上面表示数组里的元素不能更改值
const char *str1[] = {"ab", "cd", "ef"};
const char *str2 = "gh";
*str1 = str2;
但到了这种字符指针数组的情况,数组的元素指针是可以修改的{:301_985:}为什么呢
本帖最后由 110006600 于 2020-8-19 23:19 编辑
不好意思,我理解错误!