gpt4 book ai didi

c - c 中的指针在这里如何工作?

转载 作者:行者123 更新时间:2023-11-30 18:26:59 26 4
gpt4 key购买 nike

#include <stdio.h>

int my_array[] = {1,23,17,4,-5,100};
int *ptr;

int main(void)
{
int i;
ptr = &my_array[0]; /* point our pointer to the first
element of the array */
printf("\n\n");
for (i = 0; i < 6; i++)
{
printf("my_array[%d] = %d ",i,my_array[i]); /*<-- A */
printf("ptr + %d = %d\n",i, *(ptr + i)); /*<-- B */
printf("ptr + %d = %d\n",i, *ptr++);
printf("ptr + %d = %d\n",i, *(++ptr));
}
return 0;
}

ptr++ 应该打印 ptr 值而不是其中的增量,而++ptr 在 ptr 中执行第一个增量而不是打印 ptr 的值。但是当我编译代码时,它给出了相同的结果以及什么是 void 指针。它有什么用。

最佳答案

表达式*ptr++被解析为*(ptr++),并且计算如下:

  1. 检索ptr的当前值
  2. 取消引用该指针值以获得整数值
  3. 在下一个序列点之前的某个时刻,将 1 sizeof *ptr 添加到 ptr

大致相当于写作

x = *ptr;
ptr = ptr + sizeof *ptr;

除了更新ptr的副作用可能发生在下一个序列点之前的任何时间(永远假设副作用以特定顺序应用); IOW,顺序可能是

tmp = ptr;
ptr = ptr + sizeof *ptr;
x = *tmp;

在本例中,序列点位于 printf 函数调用的末尾。

表达式*(++ptr)按编写方式进行解析,并按如下方式求值:

  1. 检索ptr + sizeof *ptr的当前值
  2. 引用该指针值来获取整数值
  3. 在下一个序列点之前的某个时刻,将 1 sizeof *ptr 添加到 ptr

大致相当于写作

tmp = ptr + sizeof *ptr;
x = *tmp;
ptr = ptr + sizeof *ptr;

同样,更新 ptr 值的副作用可能发生在下一个序列点之前的任何点; IOW,顺序可能是

tmp = ptr + sizeof *ptr;
ptr = ptr + sizeof *ptr;
x = *tmp;

这是程序启动时的假设内存映射(假设 32 位地址和 16 位整数):

Item        Address            0x00  0x01  0x02  0x03----        --------           ----  ----  ----  ----my_array    0x08000000         0x00  0x01  0x00  0x17            0x08000004         0x00  0x11  0x00  0x04            0x08000008         0xff  0xfb  0x00  0x64ptr         0x0800000C         0x00  0x00  0x00  0x00i           0x10008000         0x??  0x??  0x??  0x??

0x?? indicates a random byte value. Since ptr is declared at file scope, it has static extent and is implicitly initialized to NULL. Since i is declared auto, it is not initialized and contains random garbage.

After executing the statement ptr = &my_array[0], the value of ptr is 0x08000000.

When you execute the line

printf("ptr + %d = %d", i, *ptr++);

表达式*ptr++取消引用地址0x08000000处的内存,其中包含值1,因此输出为

ptr + 0 = 1

++ 运算符的副作用将 ptr 的值更新为 0x08000002

当你执行该行时

printf("ptr + %d = %d, i, *(++ptr));

表达式*(++ptr)引用0x08000004处的内存,而不是0x08000002,因为表达式++ptr 的计算结果为ptr + sizeof *ptr。所以这一行的输出是

ptr + 0 = 17

并且 ++ 运算符的副作用将 ptr 的值更新为 0x08000004

因此,当您循环时,您的输出将如下所示

my_array[0] = 1     /* ptr = 0x08000000 */
ptr + 0 = 1
ptr + 0 = 1 /* ptr = 0x08000002 after */
ptr + 0 = 17 /* ptr = 0x08000004 after */
my_array[1] = 23
ptr + 1 = 4
ptr + 1 = 4 /* ptr = 0x08000006 after */
ptr + 1 = -5 /* ptr = 0x08000008 after */

关于c - c 中的指针在这里如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4074627/

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