指针上的&运算符
(The & operator on a pointer)这个问题的出现的原因是因为对指针变量使用&运算符时,得到的是指针变量本身的地址,而不是指向的变量的地址。
解决方法是使用转换说明符%p来打印指针变量的地址,而不是使用%d,因为指针变量的地址是一个内存地址,需要使用%p来正确打印。
下面是问题的解答:
在C语言中,&运算符用于获取变量的地址。对于指针变量来说,使用&运算符得到的是指针变量本身的地址,而不是指向的变量的地址。
例如,假设有一个整型变量a和一个指向整型变量的指针变量p,声明如下:
int a = 10;
int *p = &a;
在这个例子中,变量p是一个普通的指针变量,类型为int *。要获取指针变量p的地址,可以使用表达式&p。
为了更好地显示这个问题,可以使用typedef来定义一个类型名,例如:
typedef int * T;
然后可以使用T来声明指针变量p,如下所示:
T p = &a;
这样,表达式&p就是指针变量p的地址,就像表达式&a是变量a的地址一样。
需要注意的是,当打印指针变量的地址时,必须使用转换说明符%p,而不是%d。因为指针变量的地址是一个内存地址,需要使用%p来正确打印。
例如,可以使用下面的代码来打印指针变量p的地址:
printf("%p\n", (void *)&p);
通过使用%p转换说明符,可以正确打印指针变量p的地址。
总结起来,当对指针变量使用&运算符时,需要注意得到的是指针变量本身的地址,而不是指向的变量的地址。要正确打印指针变量的地址,需要使用转换说明符%p。
指针p也是一个变量,当与指针变量一起使用时,&运算符会给出该指针变量的地址。要打印指针,使用格式指定符%p,并且理想情况下,传递给printf()的参数应该是void指针。所以,应该这样做:
printf("%p" , (void *)p);
.....
printf("%p" , (void *)&p);
这个语句
printf("%p" , p);
将打印变量a的地址。[参数p应该进行类型转换为(void *)。]
这个语句
printf("%d" , *p);
将打印变量a的值。
在这个语句中,使用的格式指定符是错误的,应该是%p
printf("%d" , &p);
^^
|
+-->%p
当你使用正确的格式指定符%p时,它将打印变量p的地址。[参数&p应该进行类型转换为(void *)。]