我有这个问题,我不明白这意味着什么。我在评论里问我的问题。
int x = 3;
int *y = &x;
int z = *y;
printf("%d", z); //why does this give me the value and not the adress? I thought this means z =*y -> *y =&x -> &x outputs the adress of x
int *u= (y+1); //what does this mean?
printf("%d", *u); //why does this give the output of 3?
y
是指向整型变量x
的指针。
int x = 3;
int *y = &x;
解除对指针y
的引用,可以直接访问指针指向的变量x
并提取其值。
因此在这个声明中
int z = *y;
变量z
被变量x
的值初始化,通过使用指向x
的指针y
。
相应的,这个语句
printf("%d", z);
输出初始化变量z
的值3
。
在这个声明中
int *u= (y+1);
在初始化表达式中有一个带有指针算术的表达式。表达式y + 1
的类型是int *
,它位于指针y
所指向的变量(对象)x
之后的内存中。
解除对该语句中不指向有效对象的指针u
的引用
printf("%d", *u);
调用未定义行为。
int z = *y;
printf("%d", z);
问:为什么给我的是值而不是地址?
:y
指向x
变量。因此取消对y
指针的引用是5。*y
是y
所指向的值,即x
的值为3。C课本中有关指针的章节对此进行了解释。
int *u= (y+1);
问:这是什么意思?
:y
指向x
(如前所述)。y + 1
指向内存中x
之后的int
,但这是垃圾,因为该地址没有任何有效的内容,它是一个无效的内存地址。
printf("%d", *u);
问:为什么输出是3?
:如上所述,u
没有指向一个有效的地址,因此您在该地址读取的值是垃圾,它可以是任何东西。解引用指向无效内存的指针是未定义的行为(谷歌这个术语)。
指针存储地址。
星号*y
去引用指针以获得指针指向的值。
#include <stdio.h>
int main ( void) {
int x = 3;
int *y = NULL;
y = &x; // store the address of x in the pointer
// y now points to x
printf ( "address of x: %pn", (void *)&x);
printf ( "address y points to: %pn", (void *)y);
printf ( "address of y: %pn", (void *)&y);
int z = 0;
z = *y; //*y de-references the pointer to get the value at the address
//stored in the pointer.
printf ( "value y points to: %dn", *y);
printf ( "value of z: %dn", z);
int *w = NULL;
w = y; // store the address y points to in the pointer w
// w and y now point to x
printf ( "address w points to: %pn", (void *)w);
printf ( "address of w: %pn", (void *)&w);
printf ( "value w points to: %dn", *w);
int array[6] = { 1, 2, 3, 4, 5, 6};
int element = 0;
w = array; // store the address of array in w
// w now points to array
printf ( "address of array: %pn", (void *)array);
printf ( "address w points to: %pn", (void *)w);
element = *w;
printf ( "value of element: %dn", element);
element = *(w + 3);
printf ( "value of element: %dn", element);
element = w[5];
printf ( "value of element: %dn", element);
return 0;
}