指针的作用是保存特定变量的地址。那么下面代码的内存结构应该是这样的:
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;
In
int a = 5;
int *b = &a;
int *c = &b;
您收到警告是因为&b
属于类型int **
,并且您尝试初始化类型的变量int *
。这两种类型之间没有隐式转换,从而导致警告。
举一个你想要工作的更长的例子,如果我们尝试取消引用f
编译器会给我们一个int
,不是我们可以进一步取消引用的指针。
另请注意,在许多系统上int
and int*
大小不同(例如,指针可能是 64 位长,而指针可能是 64 位长)int
32 位长)。如果您取消引用f
并得到一个int
,您会丢失一半的值,然后您甚至无法将其转换为有效的指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)