Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中的指针在这里是如何工作的?_C_Pointers - Fatal编程技术网

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

c中的指针在这里是如何工作的?,c,pointers,C,Pointers,ptr++应打印ptr值而不是增量,而++ptr在ptr中执行第一次增量,而不是打印ptr值。。但当我编译代码时,它会给我相同的结果,什么是void指针。它有什么用 循环几次后,您将开始引用数组末尾以外的内存;除此之外,您的程序看起来很有意义。您可能只查看输出的最后一部分,因为当我编译它时,它会显示数组的每个值,然后在您完成整个代码部分后显示0 至于空洞指针: 它们也称为通用指针,因为您可以将它们分配给任何数据类型。这些行: #include <stdio.h> int my_ar

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

循环几次后,您将开始引用数组末尾以外的内存;除此之外,您的程序看起来很有意义。

您可能只查看输出的最后一部分,因为当我编译它时,它会显示数组的每个值,然后在您完成整个代码部分后显示0

至于空洞指针:

它们也称为通用指针,因为您可以将它们分配给任何数据类型。

这些行:

#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;
}

修改指针值。因此,在每次迭代中,您将在当前位置i之外添加2个偏移。当for循环到达第6次迭代时,您将尝试打印从数组末尾到6iterations*2offsets*4int size=48字节以外的某个位置的内存位置

首先,正如Ignacio指出的,这都是C代码。不是C++。C++是C.</P>的超集 我想指出你的for循环是不安全的。因为在每次迭代中,循环内的指针将递增两次。因此,在第4次迭代中,您将在分配的数组之外结束

< 2 >任何C问题请参考优秀的FAQ和C++ FAQ。这是你问题的一个相关答案。 它与运算符优先级有关*ptr++相当于*ptr++

第一次迭代的输出应该是 1 1 1. 十七,

void指针是泛型指针。你不能用它做算术。粗略地说,它只是用来传递位置。同样重要的是,你不能在上面做算术。因为,您不知道它指向什么。

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

检索ptr的当前值 取消引用此指针值以获取整数值 在下一个序列点之前的某个点,将1 sizeof*ptr添加到ptr。 这大致相当于写作

printf("ptr + %d = %d\n",i, *ptr++);
printf("ptr + %d = %d\n",i, *(++ptr));
tmp = ptr;
ptr = ptr + sizeof *ptr;
x = *tmp;
除了更新ptr的副作用可能发生在下一个序列点之前的任何时间,从不假设副作用以特定顺序应用;看,序列可能是

x = *ptr;
ptr = ptr + sizeof *ptr;
tmp = ptr + sizeof *ptr;
x = *tmp;
ptr = ptr + sizeof *ptr;
在这种情况下,序列点位于printf函数调用的末尾

表达式*++ptr被解析为书面形式,其计算如下:

检索ptr+sizeof*ptr的当前值 使用此指针值获取整数值 在下一个序列点之前的某个点,将1 sizeof*ptr添加到ptr 这大致相当于写作

printf("ptr + %d = %d\n",i, *ptr++);
printf("ptr + %d = %d\n",i, *(++ptr));
tmp = ptr;
ptr = ptr + sizeof *ptr;
x = *tmp;
其中,更新ptr的值的副作用可再次发生在下一序列点之前的任何点;看,序列可能是

x = *ptr;
ptr = ptr + sizeof *ptr;
tmp = ptr + sizeof *ptr;
x = *tmp;
ptr = ptr + sizeof *ptr;
下面是程序启动时假设的内存映射,假设32位地址和16位整数:

tmp = ptr + sizeof *ptr;
ptr = ptr + sizeof *ptr;
x = *tmp;
表达式*ptr++取消引用地址0x08000000处的内存,该地址包含值1,因此输出为

printf("ptr + %d = %d", i, *ptr++);
++运算符的副作用是将ptr的值更新为0x08000002

当您执行该行时

Item Address 0x00 0x01 0x02 0x03 ---- -------- ---- ---- ---- ---- my_array 0x08000000 0x00 0x01 0x00 0x17 0x08000004 0x00 0x11 0x00 0x04 0x08000008 0xff 0xfb 0x00 0x64 ptr 0x0800000C 0x00 0x00 0x00 0x00 i 0x10008000 0x?? 0x?? 0x?? 0x??
ptr + 0 = 1
表达式*++ptr将内存延迟到0x0800004,而不是0x0800002,因为表达式++ptr的计算结果为ptr+sizeof*ptr。所以这条线的输出是

printf("ptr + %d = %d, i, *(++ptr));
++运算符的副作用是将ptr的值更新为0x08000004

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

ptr + 0 = 17

我没有看到一个单一的重要位的C++在那里…FWW,数组可以隐式转换为指针到他们的第一个元素:PTR = Myz数组;完全一样。而*ptr+i是p[i]的长手。最终访问的方式超出了数组,导致行为未定义。printfptr++%d=%d\n,i,*ptr++;printfptr+%d=%d\n,i,*++ptr;它给出了相同的结果*ptr++和*++ptr,它增加了8个字节,而int在内存中占4个字节。为什么它会增加到8个字节。。它给出了相同的输出,但我现在的问题是关于后增量和预增量。。根据定义,增加后和增加前。根据post和pre增量的定义,它不应该是结果。我感觉这将调用UB。抱歉,我没有得到printfptr+%d=%d\n,I,*ptr++;printfptr+%d=%d\n,i,*++ptr;printfptr++%d=%d\n,i,*ptr++;printfptr+%d=%d\n,i,*++ptr;它的产出。。请简单地给我解释一下。。我是c或c++printfptr++%d=%d中的新成员\n,我,*ptr++;printfptr+%d=%d\n,i,*++ptr;在*ptr++中,它应该首先打印*ptr,然后递增,所以ans应该是1,因为在位置0处*ptr=1,然后递增,然后转到下一个位置,所以下次我应该得到ans 23。。当我运行我的代码时,它不是这样的。在第一次迭代中,它给我ans作为我的_数组[0]=1,ptr 0=1和ptr 0=23 ptr 0=23这个printfptr+%d=%d\n,i,*ptr++;printfptr+%d=%d\n,i,*++ptr;在第一次迭代中给出ans as 23。坦率地说,我不理解它的输出
放printfptr++%d=%d\n,i,*ptr++;printfptr+%d=%d\n,i,*++ptr;在*ptr++中,它应该首先打印*ptr,然后递增,所以ans应该是1,因为在位置0处*ptr=1,然后递增,然后转到下一个位置,所以下次我应该得到ans 23。。当我运行代码时,它不是这样的。