在C编程中,
#include <stdio.h>
int main()
{
/* POINTER TO POINTER*/
int d;
int *k;
int **p;
d=12;/* this is the value of our variable d*/
k=&d;
/*we have assigned our pointer a # to assign address of our variable.*/
p=&k;/* we have now assigned stated that the value of our second pointer is the value of the first pointer*/
printf("the value of our variable d is %d\n",d);
printf("the value of our variable k is %d\n",*k);
printf("the value of our variable p is %d\n",**p);
/* all these dislays the values of variables and not address.*/
/* to print addresss we use*/
printf("the address value of our variable d is %p\n",&d);
printf("the address value of our variable k is %p\n",k);
printf("the address value of our variable p is %p\n",p);
printf("the address value of our variable p is %p\n",&k);
printf("the address value of our variable p is equal to is equal to k %p\n",&k);
return (0);
输出看起来像这样
the value of our variable d is 12
the value of our variable k is 12
the value of our variable p is 12
the address value of our variable d is 0x7fff2692a434
the address value of our variable k is 0x7fff2692a434
the address value of our variable p is 0x7fff2692a438
the address value of our variable p is 0x7fff2692a438
the address value of our variable p is equal to is equal to k 0x7fff2692a438
我在想所有的地址位置应该是平等的,但不是。
我试着用#给第一个点赋值但是编译失败
请帮助。
我认为你的困惑来自变量的value和它的address之间的区别。
首先,你应该区分:
每当你对变量进行简单赋值时,在你的情况下
d = 12
值
12
被复制到变量d
。所以现在变量d
将包含值12
.
要获取任何变量的地址,您可以使用
&
运算符。您可以像这样检查变量d
的值和地址以及值:
printf("The value of d is: %d\n", d);
printf("The address of d is: %p\n", &d);
声明变量
k
时会发生同样的事情。唯一的区别是 int *
类型的变量将包含地址作为 values。这就是它可能会有点混乱的地方:k
是一个变量,所以它有一个地址,而且这个变量 stores 地址。为了更好地证明这一点,我们可以打印它的价值和地址:
int *k = &d;
printf("The value of k is: %p\n", k); // same as &d
printf("The address of k is: %p\n", &k); // different from &d
由于
d
和k
是不同的变量,它们会存放在不同的位置,所以这些变量会有不同的address。但是,k
的 value将等于
d
的 address,因为您明确地将它分配给了
k
.
使用指针值,您可以取消引用它们。这将使用指针的 value 并返回该指针指向的内存位置的值。由于
k
指向 d
的地址,取消引用 k
将返回存储在地址 &d
的值,因此我们可以预期代码打印 12.
printf("The value k points to: %d\n", *k); // should print 12
变量
p
又是另一个变量,所以它的地址与d
的地址和k
的地址不同。
int **p = &k;
printf("The address of p is: %p\n", &p);
printf("The value of p is: %p\n", p);
printf("The value of k is: %p\n", *p);
printf("The value of d is: %p\n", **p);
您会期望第一行打印的地址与
&d
和&k
不同,因为毕竟d
、k
和p
三个不同的变量 都存储在不同的位置。
因为你把
&k
的值赋给了p
,所以第二行会打印出k
(&k
)的地址。
第三行会打印出
k
地址指向的值,即k
本身的值,即&d
。
最后第四行会打印出
&d
指向的值,或者说d
的值,即12
的值。
我鼓励您在调试器(内置于 Visual Studio 中)中使用指针。您可以打开 Watch 和 Memory 窗口并查看原始内存,以更好地了解值和地址以及它们如何运行。