我正在尝试使用双指针,但无法链接它们。这是例子,

问题描述 投票:0回答:1

在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

我在想所有的地址位置应该是平等的,但不是。

我试着用#给第一个点赋值但是编译失败

请帮助。

c pointers
1个回答
0
投票

我认为你的困惑来自变量的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 窗口并查看原始内存,以更好地了解值和地址以及它们如何运行。

© www.soinside.com 2019 - 2024. All rights reserved.