gpt4 book ai didi

c - 指针前/后增量

转载 作者:行者123 更新时间:2023-11-30 20:07:34 25 4
gpt4 key购买 nike

谁能完整解释一下下面的代码吗?

#include<stdio.h>
#include<stdlib.h>

int main()
{
int *a, *s, i;

a = s = (int *) malloc(4 * sizeof(int));

for (i = 0; i < 4; i++)
{
*(a + i) = i * 10;
printf(" %d ", *(a + i));
}

printf("\n");
printf("%d\n", *s++);
printf("%d\n", (*s)++);
printf("%d\n", *s);
printf("%d\n", *++s);
printf("%d\n", ++*s);
printf("\n");
printf("%d\n", *a++);
printf("%d\n", (*a)++);
printf("%d\n", *a);
printf("%d\n", *++a);
printf("%d\n", ++*a);

return 0;
}

输出:

0 10 20 30
0
10
11
20
21

0
11
12
21
22

1) 指针 's' 如何打印值,其中 *(a+i)仅被分配 for循环中的值?

2) 当 *(a+i) 时,该值到底去哪里并存储在哪里?已分配?

3) *s++ 有什么区别, (*s)++ , *++s , ++*s

4)为什么当我打印类似于 s 的指针 a 时,值会增加 1?

提前致谢! :)

最佳答案

1 和 2) 指针指向(或者可以说它是某个内存位置的地址)。由于您分配了 a = s = (int*) malloc(4 * sizeof(int));as 都具有相同的地址,或指向相同的内存位置。如果内存位置的内容发生任何变化(例如,在您的代码中,您正在为分配的内存分配数字),那么只要您有正确的地址(as 指向同一位置),您可以看到内容变化。

一个粗略的类比是,您请求一个房子(malloc),它给您返回房子的地址(a)。然后你认为房子很丑,你想重新粉刷它(赋值:*(a + i) = i + 10),你告诉地址的其他人(s) 将看到您的房子已被重新粉刷。

3)

*s++表示访问当前地址处的内容,稍后递增指针(地址)。

回想一下你的代码,它访问第一个元素,然后地址将指向第二个元素。

(*s)++表示访问当前地址的内容,稍后递增当前地址的内容

回想一下您的代码,它会在递增第二个元素之前获取第二个元素的内容。下一个打印语句显示第二个元素的内容已增加。

*++s表示将当前地址递增,并访问递增后地址处的内容。

反射(reflection)你的代码,它获取第三个元素的内容。

++*s表示将当前地址处的内容递增,并访问递增后的内容。

反射(reflection)你的代码,它获取第三个元素的递增内容。

4)正如前面部分所解释的,如果您通过一个指针修改内容,如果您有相同的指针(地址),您将看到它。您实际上是在修改内存地址的内容(如3中所述),因此重复该过程时可能会看到修改的效果。

关于c - 指针前/后增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10975421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com