为什么在分配给直接数组时指针算术会给出错误

时间:2019-07-19 08:05:20

标签: c pointers

我正在尝试使用指针算术编写代码,但似乎会出错。

指向arr的指针*p通过指针算术给出了所需的输出,但是当我对*k做同样的操作时,它给出了错误。

#include<stdio.h>

main(){
    int arr[]={1,2,3,4};
    int *p=arr;
    int *k={1,2,3,4};
    printf("%d",*arr+2);
    printf("%d",*k+2);
}

我希望*k+2的输出与*arr+2完全相同,但不会那样。可能是什么原因

2 个答案:

答案 0 :(得分:4)

指针不是数组,不能使用相同的语法来初始化它们,在第一种情况下,p 指向指向数组的第一个元素的地址,而在第二种情况下您正在将1(列表的第一个值)分配为指针的值,因此k 指向指向地址0x01,并且由于您不允许取消引用此地址,否则会出现错误(可能是分段错误)。

demo.c:7:5: warning: initialization makes pointer from integer without a cast
     int *k={1,2,3,4};
     ^

但是,由于C99我们可以使用复合文字,因此复合文字使我们可以使用给定的初始化值列表创建未命名的对象,换句话说:您可以将类型转换为数组用作初始化器。

通过这种方式:

int *k= (int []){1,2,3,4};

答案 1 :(得分:1)

做int * k = {1,2,3,4};您基本上是在声明一个指向int的指针,然后像数组一样对其进行初始化,因此语法不正确。