C:为什么指针和&;指针有不同的值吗?
如果我在OS X上运行以下操作:C:为什么指针和&;指针有不同的值吗?,c,pointers,memory-address,C,Pointers,Memory Address,如果我在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:1592302512,n&:1592302480 为什么代码中的值不同? i
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:1592302512,n&:1592302480
为什么代码中的值不同?
int* n; //initialization is not done
*n = 20;
调用未定义的行为。您正在尝试取消引用(写入)未初始化的内存。在取消引用之前,必须将内存分配给n
除此之外,
属于n
int*
将是&n
int**
%p
格式说明符和printf()
来打印代码中的指针。
int* n; //initialization is not done
*n = 20;
调用未定义的行为。您正在尝试取消引用(写入)未初始化的内存。在取消引用之前,必须将内存分配给n
除此之外,
属于n
int*
将是&n
int**
%p
格式说明符和printf()
来打印指针
为什么指针
和指针
有不同的值
表达式&n
产生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);
为什么指针
和指针
有不同的值
表达式&n
产生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
声明一个名为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?
作为另一种选择,让我用另一种方式来阐述这一点
char *ptr;
char c='A';
ptr = &c;
在这段代码中,当我们以不同的方式限定ptr
时,发生了什么以及找到了什么值
ptr
本身包含char c
变量所在的内存地址。
*ptr
取消对指针的引用,返回变量c
的实际值。在这种情况下,大写字母a。
&ptr
将为您提供ptr
表示的内存位置的地址。换句话说,如果您需要知道指针本身所在的位置,而不是它指向的对象的地址,那么这就是您获得它的方式。作为一种替代方法,让我用另一种方式来解释它
char *ptr;
char c='A';
ptr = &c;
在这段代码中,当我们以不同的方式限定ptr
时,发生了什么以及找到了什么值
ptr
本身包含char c
变量所在的内存地址。
*ptr
取消对指针的引用,返回变量c
的实际值。在这种情况下,大写字母a。
&ptr
将为您提供ptr
表示的内存位置的地址。换句话说,如果您需要知道指针本身的位置,而不是它指向的对象的地址,那么这就是您获得它的方式。为什么您希望它们是相同的?你认为和的效果是什么?为什么你认为它们是一样的?你认为&
的效果是什么?@gio很好。乔:接得好。编辑。