重新分配(*ptr=n)时指针(&ptr)的地址是否会改变?为什么C不允许const指针(constint**)到非const(int**)指针答案(重新分配c盘d盘空间)

您所在的位置:网站首页 快玩传奇霸业活动攻略视频 重新分配(*ptr=n)时指针(&ptr)的地址是否会改变?为什么C不允许const指针(constint**)到非const(int**)指针答案(重新分配c盘d盘空间)

重新分配(*ptr=n)时指针(&ptr)的地址是否会改变?为什么C不允许const指针(constint**)到非const(int**)指针答案(重新分配c盘d盘空间)

2023-01-02 23:46| 来源: 网络整理| 查看: 265

假设您有以下代码:

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