如果我在OS X上运行以下命令:
int main (void)
{
int* n; // initialise(declare) pointer
*n = 20; // the value in address pointed to by n is 20
printf("n: %i, n&: %i\n", n, &n);
return 0;
}
我明白了:
n:1592302 512 ,n&:1592302 480
为什么不同的值?
答案 0 :(得分:5)
为什么
pointer
和&pointer
有不同的值?
表达式&n
产生n
本身的地址,而n
计算指针的值,即它指向的东西的地址到。
但请注意,您有未定义的行为首先,因为您正在取消引用未初始化的指针。您需要将n
指向可以写入的位置。
例如,
int* n;
int i = 42;
n = &i;
// now you can de-reference n
*n = 20;
其次,printf
的{{1}}说明符错误。您需要&n
:
%p
答案 1 :(得分:2)
在您的代码中
int* n; //initialization is not done
*n = 20;
调用未定义的行为。您正在尝试取消引用(写入)未初始化的内存。在取消引用之前,您必须将内存分配给n
。
除了那个部分,
n
的类型为int *
&n
的类型为int **
所以,他们 不同,并且应该有不同的值。
也就是说,您应该使用%p
格式说明符和printf()
来打印指针。
答案 2 :(得分:2)
int* n
声明一个名为n
的变量,它是一个指向整数的指针
&n
返回变量n
的地址,该变量将指向指向整数的指针。
假设我们有以下代码:
int a = 20; // declare an integer a whose value 20
int* n = &a; // declare a pointer n whose value is the address of a
int** p = &n; // declare a pointer p whose value is the address of n
在这种情况下,我们会有以下内容:
variable name | value | address in memory
a | 20 | 1592302512
n | 1592302512 | 1592302480
p | 1592302480 | who knows?
答案 3 :(得分:0)
作为替代方案,让我以不同的方式拼出这个。
char *ptr;
char c='A';
ptr = &c;
在此代码中,当我们以不同方式限定ptr
时,会发生什么以及找到什么值。
ptr
本身包含char c
变量所在的内存中的地址。
*ptr
取消引用指针,返回变量c
的实际值。在这种情况下,资本A.
&ptr
将为您提供ptr
所代表的内存位置的地址。换句话说,如果你需要知道指针本身的位置而不是它所指向的地址是什么,这就是你得到它的方式。