C 引用指针时出现意外值

C 引用指针时出现意外值,c,pointers,C,Pointers,我玩编译器是为了理解C语言中指针是如何工作的。 首先,我运行了以下代码并获得了预期的输出: int *array1[] = {1,4,3,4}; int main() { printf("%d \n", array1[0+1]); printf("%d", array1[1+1]); return 0; } 产出为: 4. 三, 其次,我运行了以下代码-我无法理解其输出: int *array1[] = {1,4,3,4}; int main() { pr

我玩编译器是为了理解C语言中指针是如何工作的。 首先,我运行了以下代码并获得了预期的输出:

int *array1[] = {1,4,3,4};

int main()
{
    printf("%d \n", array1[0+1]);
    printf("%d", array1[1+1]);

    return 0;
}
产出为: 4. 三,

其次,我运行了以下代码-我无法理解其输出:

int *array1[] = {1,4,3,4};

int main()
{
    printf("%d \n", array1[0]+1);
    printf("%d", array1[1]+1);

    return 0;
}
输出: 5. 八,

看起来我在数组的值上加了4,但是为什么呢?数组中的每个元素由一个字节组成

谢谢

看起来我在数组的值上加了4,但是为什么呢

不,数组的每个元素都是int*,因为您是这样声明数组的:

int *array1[] = {1,4,3,4};
也就是说,array1是一个数组,其值的类型指针指向int。如果需要int数组,请删除*,如:

当添加或减去指针类型时,该值会更改指针引用的类型大小的若干倍。系统上的int可能是4个字节,因此像array1[0]+1这样的表达式获取存储在数组[0]中的int*并将其递增,因此它将按sizeofint递增

数组中的每个元素由一个字节组成

即使将数组声明为int数组而不是int*数组,int的大小也可能不是1字节。int通常为4字节长,但大小取决于编译器和目标系统

看起来我在数组的值上加了4,但是为什么呢

不,数组的每个元素都是int*,因为您是这样声明数组的:

int *array1[] = {1,4,3,4};
也就是说,array1是一个数组,其值的类型指针指向int。如果需要int数组,请删除*,如:

当添加或减去指针类型时,该值会更改指针引用的类型大小的若干倍。系统上的int可能是4个字节,因此像array1[0]+1这样的表达式获取存储在数组[0]中的int*并将其递增,因此它将按sizeofint递增

数组中的每个元素由一个字节组成

即使将数组声明为int数组而不是int*数组,int的大小也可能不是1字节。int的长度通常为4字节,但大小取决于编译器和目标系统。

int *array1[] = {1,4,3,4};
您正在定义指向整数的指针数组

所以这个数组的每个元素,即使用看起来是整数值的东西初始化,实际上都是指针,也就是地址

如果您遵守了这些指针,可能会导致分段错误。但幸运的是,您只是简单地打印了它们,即使使用%d而不是%p:根据C标准的选择可能会导致未定义的行为。无论如何,在您的例子中,指针被转换为整数,并且打印的值是预期值。就像数组是整数数组一样

在第二个示例中,您进一步推送了它:在数组元素中添加了1。但由于它们是指针,所以应用了指针算法。表示指针+N=指针+N*sizeof*指针。在本例中,由于sizeofint为4:

数组[0]+1=

=1+sizeof数组[0]=

=1+sizeof int=

=1+4=5

您正在定义指向整数的指针数组

所以这个数组的每个元素,即使用看起来是整数值的东西初始化,实际上都是指针,也就是地址

如果您遵守了这些指针,可能会导致分段错误。但幸运的是,您只是简单地打印了它们,即使使用%d而不是%p:根据C标准的选择可能会导致未定义的行为。无论如何,在您的例子中,指针被转换为整数,并且打印的值是预期值。就像数组是整数数组一样

在第二个示例中,您进一步推送了它:在数组元素中添加了1。但由于它们是指针,所以应用了指针算法。表示指针+N=指针+N*sizeof*指针。在本例中,由于sizeofint为4:

数组[0]+1=

=1+sizeof数组[0]=

=1+sizeof int=

=1+4=5


谢谢,工作。然而,你能解释我在第二段代码中的输出吗?@Bob_Bobb看到我刚才添加的段落,我想这段解释了它。请注意,1或4是int*的有效值,即使内存位置1或4中实际上没有存储int值。1和4是否是int*的有效值取决于实现。需要注意的是,C标准没有定义使用%d打印int*时的行为。谢谢,正在工作。然而,你能解释我在第二段代码中的输出吗?@Bob_Bobb看到我刚才添加的段落,我想这段解释了它。请注意,1或4是int*的有效值,即使内存位置1或4中实际上没有存储int值。1和4是否是int*的有效值取决于实现。需要注意的是,尝试使用%d打印int*时的行为未定义为b
y是C标准。请注意,打印指针时数组元素是带有%d的指针是不正确的,会调用UB。请注意,打印指针时数组元素是带有%d的指针是不正确的,会调用UB。