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
。似乎又是宾基的时候了: