C:为什么指针和指针有不同的值?
如果我在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
为什么价值观不同?
为什么
pointer
和&pointer
有不同的值?
表达式&n
产生n
本身的地址,而n
计算指针的值 ,即它指向的东西的地址。
但请注意,您有未定义的行为首先,因为您正在取消引用未初始化的指针。 你需要在你可以写的地方写点。
例如,
int* n; int i = 42; n = &i; // now you can de-reference n *n = 20;
其次,你有&n
的错误printf
说明符。 你需要%p
:
printf("n: %i, &n: %p\n", n, &n);
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?
在你的代码中
int* n; //initialization is not done *n = 20;
调用未定义的行为。 你试图取消引用(写入)未初始化的内存。 在取消引用之前,必须将内存分配给n
。
除了那个部分,
-
n
的类型为int *
-
&n
将是int **
类型
所以,他们是不同的,应该有不同的价值观。
也就是说,你应该使用%p
格式说明符和printf()
来打印指针。
作为替代方案,让我以不同的方式拼出这个。
char *ptr; char c='A'; ptr = &c;
在这段代码中,当我们以不同的方式限定ptr
时,这里发生了什么以及找到了什么值。
ptr
本身包含char c
变量所在的内存中的地址。 *ptr
取消引用指针,返回变量c
的实际值。 在这种情况下,大写A. &ptr
将为您提供ptr
表示的内存位置的地址。 换句话说,如果你需要知道指针本身的位置而不是它所指向的地址是什么,这就是你得到它的方式。