指针的作用是保存特定变量的地址.那么下面代码的内存 struct 应该是这样的:

int a = 5;
int *b = &a;

...... memory address ...... value
a ... 0x000002 ................... 5
b ... 0x000010 ................... 0x000002

好吧,好吧.然后假设现在我想保存指针*b的地址.然后我们通常定义一个双指针,**c,如下所示:

int a = 5;
int *b = &a;
int **c = &b;

然后内存 struct 看起来像:

...... memory address ...... value
a ... 0x000002 ................... 5
b ... 0x000010 ................... 0x000002
c ... 0x000020 ................... 0x000010

所以**c指的是*b的地址.

现在我的问题是,为什么这种类型的代码,

int a = 5;
int *b = &a;
int *c = &b;

生成警告?

如果指针的目的只是保存内存地址,我认为如果我们要保存的地址引用变量、指针、双指针等,就不应该有层次 struct ,所以下面的代码类型应该是有效的.

int a = 5;
int *b = &a;
int *c = &b;
int *d = &c;
int *e = &d;
int *f = &e;

推荐答案

在里面

int a = 5;
int *b = &a;   
int *c = &b;

因为&b的类型为int **,所以会收到一条警告,并try 初始化int *类型的变量.这两种类型之间没有隐式转换,因此会出现警告.

举一个较长的例子,如果我们try go 引用f,编译器会给我们一个int,而不是一个我们可以进一步go 引用的指针.

还请注意,在许多系统上,intint*的大小不同(例如,指针的长度可能为64位,而intint*的长度可能为32位).如果你取消对f的引用,得到一个int,你会损失一半的值,然后你甚至不能将它转换为一个有效的指针.

C++相关问答推荐

librsvg rsvg_handle_get_dimensions获取像素大小与浏览器中的渲染大小没有不同

C sscanf没有捕获第二个参数

变量的const视图是否定义良好?

C语言中字符数组声明中的标准

如何将字符串argv[]赋给C中的整型数组?

在C23中使用_GENERIC实现带有右值的IS_POINTER(P)?

具有交换链获取和命令缓冲区提交的同步-危险-读后写错误

如何在C中使printf不刷新标准输出?

在 struct 中强制转换空指针

Sizeof(&Q;字符串&Q;)的正确输出是什么?

对于C中给定数组中的每个查询,如何正确编码以输出给定索引范围(1到N)中所有数字的总和?

在句子中转换单词的问题

C语言中MPI发送接收字符串时出现的分段错误

Realloc():中止的下一个大小无效(核心转储)

用于计算位数和的递归C函数

向左移位3如何得到以字节为单位的位数?

为什么我在我的代码中得到错误和退出代码-1073741819(0xC0000005),但如果我添加了一个不相关的打印语句,它仍然有效?

为什么argc和argv即使在主函数之外也能工作?

如何在C中计算包含递增和递减运算符的逻辑表达式?

Struct 内的数组赋值