繁体   English   中英

无法理解涉及指针的C程序的一小部分

[英]Can't understand small part of a C program involving pointers

int x = 5;
int y = 6;
int *p = &x;
*p = x + y;
p = &y;
*p = x + y;
printf("%d,%d", x, y);

我可以理解前三行。 我知道int *p = &x; 表示指针p指向x的存储地址。 但是我看不懂代码的下4行。 该代码的输出为:

 11,17

但是我不明白怎么办? 有人可以向我解释。

指针是一个变量,其值是另一个变量的地址,即存储位置的直接地址。

这样分配时,

 int *p=&x;// It will point to the address of x variable. 

*p所做的任何更改都会影响内存。 因此,当您使用x访问它时,它具有值。

 *p=x+y; // It's equivalent x=x+y;

然后y也很喜欢这一点。

现在x的值为11 p=&y;

  *p=x+y;// It's equivalent to y=x+y;

所以现在x的值为11 ,y的值为5 因此,结果为17

让我们逐行分析代码,对吧?

在给出答案之前,将一个小信息*称为间接取消引用运算符,该运算符用于访问内存地址处

因此,根据您的代码:

  • *p = x + y; xy相加,然后将值存储在p指向存储位置中 (即x的地址)。 因此,这样, x的实际值将被修改。 现在, x持有x+y5+611

  • p = &y; int *p = &x;相同的逻辑

  • *p = x + y; 与第一点相同的逻辑。 请记住, x值是在第一次修改的,因此将考虑最新的x值。 因此,修改后的y将为11 + 617

  • printf("%d,%d", x, y); 现在,不要告诉我您不了解这一行。 :-)

      *p = x + y; 

因此,现在p将指向x的地址,而(* p)将指向x中存储的值。 因此,您可以在内存位置更改x的值。

       p = &y;

现在,您将y的地址分配给p。

       *p = x + y;

现在,您可以使用其内存地址更改y的值。

实际上,此代码段

int x = 5;
int y = 6;
int *p = &x;
*p = x + y;
p = &y;
*p = x + y;
printf("%d,%d", x, y);

您可以重写以下方式而无需使用指针,这样会更清楚

int x = 5;
int y = 6;
x = x + y;
y = x + y;
printf("%d,%d", x, y);

因此,首先将x设置为x + y和,将等于11 ,然后将y设置为更新的x (现在等于11)和y和,并将等于17

唯一的区别在于,第一个代码段不是直接使用xy ,而是使用指针。

从而

陈述x = x + y; 替换为这两个语句的组合

int *p = &x;
*p = x + y;

和声明

y = x + y;

替换为这两个语句的组合

p = &y;
*p = x + y;

也就是说,首先为指针p分配了x的地址

int *p = &x;

并为对象(即x)分配了x + y的和

*p = x + y;

对于变量y和指针p重复相同的操作。

*p = x + y

解引用指针p,将x + y值分配给p指向的内存。 等效于x = x + y x现在等于x + y ,即5 + 6 = 11

p = &y

将y的地址分配给指针p。 指针p指向换句话说y的存储。

*p = x +y

解引用指针p,将x + y值分配给p指向的内存。 等效于y = x + y y现在等于x + y,即11 + 6 = 17

最后, x = 11y = 17

希望能帮助到你。

为了更好地理解指针和相关的与号和星号,我建议使用以下基本声明:
让我们假设:

int * p;
int x;

1)指针是一个地址。 这意味着在p中是内存中存储整数值的地址
2)当使用* p时,可以将星号符号“翻译”为“地址值”; 这意味着当我们使用* p时,我们想要取一个位于地址p中的值;
3)当使用&x时,“&”符号可以“翻译”为“的地址”; 这意味着我们要取x的地址;

因此操作:
0)p = x; 是不正确的;
1)* p = x; 是正确的(如果p是有效地址),并且地址p的值现在与值x相同;
2)p =&x; 是正确的,并且* p == x; 在这种情况下,您还需要了解p和&x是相同的地址。 因此,如果您更改* p或x,则另一个也将具有相同的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM