C:为什么指针和指针有不同的值?
如果我运行OS X以下几点:C:为什么指针和指针有不同的值?
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 ,正&:1592302和
为什么不同的价值观?
在你的代码
int* n; //initialization is not done
*n = 20;
调用未定义的行为。你试图去引用(写入)未初始化的内存。在解除引用之前,您必须分配内存到n
。
除了形成部分,
-
n
是int *
型 -
&n
将类型int **
所以,他们是不同,应该有不同的值。
也就是说,您应该使用%p
格式指定符与printf()
来打印指针。
为什么
pointer
和&pointer
有不同的值?
表达&n
产生的n
本身的地址,而n
计算结果为值指针的,即它指向事物的地址。
但请注意,您有未定义的行为首先,因为您正在取消引用未初始化的指针。您需要将n
指向您可以写信的地方。
例如,
int* n;
int i = 42;
n = &i;
// now you can de-reference n
*n = 20;
其次,你打错printf
说明符&n
。您需要%p
:
printf("n: %i, &n: %p\n", n, &n);
我认为他进一步使用不正确的说明符&n – 2015-02-09 20:56:22
@gio良好的捕获。编辑。 – juanchopanza 2015-02-09 21:00:26
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
表示的内存位置的地址。换句话说,如果你需要知道指针本身的位置,而不是它指向的地址是什么,这就是你如何得到它。
你为什么期望他们是一样的?你认为'&'的作用是什么? – 2015-02-09 20:47:04