Can';我不理解C程序中涉及指针的一小部分
我能理解前三行。我知道Can';我不理解C程序中涉及指针的一小部分,c,pointers,memory,C,Pointers,Memory,我能理解前三行。我知道int*p=&x表示指针p指向x的内存地址。但我无法理解接下来的4行代码。此代码的输出为: int x = 5; int y = 6; int *p = &x; *p = x + y; p = &y; *p = x + y; printf("%d,%d", x, y); 但我不明白怎么回事?有人能给我解释一下吗。让我们逐行分析代码,好吗 在开始回答之前,一个小信息,*称为间接或解引用运算符,用于访问内存地址处的值 因此,根据您的代码: *p=x+y添加x
int*p=&x
表示指针p
指向x
的内存地址。但我无法理解接下来的4行代码。此代码的输出为:
int x = 5;
int y = 6;
int *p = &x;
*p = x + y;
p = &y;
*p = x + y;
printf("%d,%d", x, y);
但我不明白怎么回事?有人能给我解释一下吗。让我们逐行分析代码,好吗 在开始回答之前,一个小信息,
*
称为间接或解引用运算符,用于访问内存地址处的值
因此,根据您的代码:
添加*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
*p=x+y;// It's equivalent to y=x+y;
printf(“%d,%d”,x,y)代码>现在不要告诉我你不明白这句话。:-)
11,17
在*p
中所做的任何更改都将影响内存。因此,当您使用x
访问它时,它具有值
int *p=&x;// It will point to the address of x variable.
然后y
也像这样
现在x
具有值11
<代码>p=&y代码>
*p=x+y; // It's equivalent x=x+y;
现在x的值是11
,y的值是5
。因此结果是17
*p=x+y;// It's equivalent to y=x+y;
现在p将指向x的地址,(*p)将指向存储在x中的值。所以你要改变x的值,在它的内存位置
*p = x + y;
现在将y的地址分配给p
p = &y;
现在,您可以使用y的内存地址更改y的值。事实上,这段代码片段
*p = x + y;
您可以用以下方式重写,而不使用更清晰的指针
int x = 5;
int y = 6;
int *p = &x;
*p = x + y;
p = &y;
*p = x + y;
printf("%d,%d", x, y);
因此,首先将x
设置为x+y
之和,等于11
,然后将y
设置为更新后的x
(现在等于11)和y
之和,等于17
*p=x+y;// It's equivalent to y=x+y;
唯一的区别是第一个代码段使用指针,而不是直接使用x
和y
因此
声明
x=x+y;
替换为这两个语句的组合
int x = 5;
int y = 6;
x = x + y;
y = x + y;
printf("%d,%d", x, y);
y = x + y;
和声明
int *p = &x;
*p = x + y;
替换为这两个语句的组合
int x = 5;
int y = 6;
x = x + y;
y = x + y;
printf("%d,%d", x, y);
y = x + y;
也就是说,在第一个指针p被分配了x的地址
p = &y;
*p = x + y;
对象(即x)被指定为x+y之和
int *p = &x;
对于变量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
希望能有所帮助。为了更好地理解指针和相关的符号和星号,我建议使用以下基本语句:
让我们假设:
*p = x + y
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,另一个也将具有相同的值。只需在代码中用适当的x或y替换*p,它就会变得明显。“我知道
int*p=&x;
表示指针p
指向x
的内存地址,这很有趣,因为它不是!它指向x
。似乎又是宾基的时候了: