【发布时间】:2016-10-30 19:50:11
【问题描述】:
指针的目的是保存特定变量的地址。那么下面代码的内存结构应该是这样的:
int a = 5;
int *b = &a;
……内存地址……值
一个 ... 0x000002 ................... 5
b ... 0x000010 ................... 0x000002
好的,好的。然后假设现在我要保存指针 *b 的地址。那么我们一般定义一个双指针,**c,为
int a = 5;
int *b = &a;
int **c = &b;
那么内存结构是这样的:
……内存地址……值
一个 ... 0x000002 ................... 5
b ... 0x000010 ................... 0x000002
c ... 0x000020 ................... 0x000010
所以**c指的是*b的地址。
现在我的问题是,为什么这种类型的代码,
int a = 5;
int *b = &a;
int *c = &b;
生成警告?
如果指针的目的只是为了保存内存地址,我认为如果我们要保存的地址是指变量、指针、双指针等,应该没有层次结构,所以下面的类型的代码应该是有效的。
int a = 5;
int *b = &a;
int *c = &b;
int *d = &c;
int *e = &d;
int *f = &e;
【问题讨论】:
-
除了这么多好的答案,我可以发表一个简单的评论。 Clang 编译器在尝试编译代码中有问题的部分时会发出这个明确的警告:
warning: incompatible pointer types initializing 'int *' with an expression of type 'int **'; remove & [-Wincompatible-pointer-types]。这可能已经说明了一切。 -
初学者经常感到困惑,因为他们认为“地址”本身就是一种数据类型。他们不是。 X 类型数据的地址是。对于不同的类型,它们是不同的。这使您相信 int * 和 int ** 是相同的。
-
"如果指针的目的只是为了保存内存地址",则不是。指针的目的是保存对象的“内存地址”及其类型。只需开始取消引用指针,您就会看到。
-
抱歉,不要失礼,只是想知道,是什么让 this 问题如此有用?这在任何中等的 C 书,指针第二章或第三篇文章中都有,更不用说,在 SO 中多次讨论过。我错过了什么明显的东西吗?
-
@SouravGhosh 这家伙可能通过从一些人口众多的初学者论坛链接来提升他的代表问题