重新分配(*ptr=n)时指针(&ptr)的地址是否会改变?为什么C不允许const指针(constint**)到非const(int**)指针答案(重新分配c盘d盘空间) |
您所在的位置:网站首页 › 快玩传奇霸业活动攻略视频 › 重新分配(*ptr=n)时指针(&ptr)的地址是否会改变?为什么C不允许const指针(constint**)到非const(int**)指针答案(重新分配c盘d盘空间) |
假设您有以下代码: char *p = strdup("bark");const char **dp = &p;使用gcc in.c -o out.c -Wall -Wextra -pedantic -Wpedantic编译运行: warning: initialization of ‘const char **’ from incompatible pointer type ‘char **’ [-Wincompatible-pointer-types]const char **dp = &p; ^警告信息很明确:两个指针的类型不兼容。要了解为什么会出现问题,请尝试通过dp 修改p 的内容: char *p = strdup("bark");const char **dp = &p;**dp = 'd';使用相同的命令编译和运行: warning: initialization of ‘const char **’ from incompatible pointer type ‘char **’ [-Wincompatible-pointer-types]const char **dp = &p; ^error: assignment of read-only location ‘**dp’**dp = 'd'; ^const char **dp中的const适用于*dp所指向的内容,即p(非const)。这就是您看到不兼容警告消息的原因。 现在,尝试做: char *p = strdup("bark");const char **dp = &p;*dp = strdup("dark");代码编译得很好(带有上述警告)。但是,将上面的代码更改为 char *p = strdup("bark");char *const *dp = &p;*dp = strdup("dark");会产生以下错误: error: assignment of read-only location ‘*dp’*dp = strdup("dark"); ^与const char **dp 不同,char *const *dp 中的const 适用于dp 所指向的指针,即;p。因此,不允许更改它。 请注意,在同样的情况下,**dp = 'd'; 将编译得很好(带有上述警告)。 您可以进一步尝试: char *p = strdup("bark");const char *const *dp = &p;*dp = strdup("dark"); // Error**dp = 'p'; // Errorwarning: initialization of ‘const char * const*’ from incompatible pointer type ‘char **’ [-Wincompatible-pointer-types]const char *const *dp = &p; ^error: assignment of read-only location ‘*dp’*dp = strdup("dark"); ^error: assignment of read-only location ‘**dp’**dp = 'x'; ^也许以不同的方式编写语法会使事情更清楚: const char **dp == (const char)* *dpchar *const *dp == const (char*) *dpconst char *const *dp == const (const char)* *dp |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |