我有点困惑:
int* p=1000;
printf("%d\n", (int)(p+sizeof(int))); // what is going on here?
p
指向1000
还是p =内存地址1000
?如果是前者,可以实现这样的目标:
int dummyVariable = 1000;
int * p = &dummyVariable;
答案 0 :(得分:2)
声明
int* p=1000;
将p
指向指向地址1000
。
在
的情况下int dummyVariable = 1000;
int * p = &dummyVariable;
您将dummyVariable
初始化为值1000
,并使p
指向dummyVariable
。
另一种看待它的方式:
在第一种情况下,你有
Address 1000 | v +---+ +-----+ | p | --> | ??? | +---+ +-----+
在第二种情况下,你有
Address &dummyVariable | v +---+ +----------------------------+ | p | --> | dummyVariable (value 1000) | +---+ +----------------------------+
第三种看待它的方法是p
的值是一个整数(恰好是一个地址)。在第一种情况下,p
包含值1000
,即它指向地址1000
。
在第二种情况下,p
的内容为&dummyVariable
,即它指向内存中存储dummyVariable
的位置。
对于第一个示例中的打印输出,给出值1016
,这是因为指针算法的工作原理:无论添加到指针的是什么,都会乘以基类型的大小。因此,如果您有一个指向int
的指针,那么您添加到该指针的所有内容都将乘以sizeof int
。
在您的情况下,int
的大小为4
字节,因此您所做的实际上是1000 + 4 * 4
,等于1016
。
答案 1 :(得分:1)
在您的示例中,p
存储内存地址1000
,无论该内存地址是什么。实际上,p
驻留在另一个内存地址,该地址再次存储数字1000
,这是一个内存地址等。您的第二个示例是正确的:指针p
被分配了内存地址dummyVariable
,现在如果修改dummyVariable
或*p
(取消引用指针),则更改将应用于两者(因为它们指向相同的内存空间)。
答案 2 :(得分:0)
int* p=1000;
p是指向内存位置1000的指针。
printf("%d\n", (int)(p+sizeof(int)));
你正试图在这里访问一些内存。(1000 + sizeof(int)) 直接将一些随机地址分配给指针就像在这里完成一样不是一个好主意。 你应该得到以下提到的警告:
warning: initialization makes pointer from integer without a cast
warning: cast from pointer to integer of different size
第二部分:
int dummyVariable = 1000;
int * p = &dummyVariable;
这里1000是一个值,指针p
指向一个持有1000的内存位置。
所以两者都不同。