[英]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;
将x
和y
相加,然后将值存储在p
指向的存储位置中 (即x
的地址)。 。 因此,这样, x
的实际值将被修改。 现在, x
持有x+y
或5+6
或11
。
p = &y;
与int *p = &x;
相同的逻辑
*p = x + y;
与第一点相同的逻辑。 请记住, x
值是在第一次修改的,因此将考虑最新的x
值。 因此,修改后的y
将为11 + 6
或17
。
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
。
唯一的区别在于,第一个代码段不是直接使用x
和y
,而是使用指针。
从而
陈述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 = 11
, y = 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.