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

C 为什么指针算法在分配给直接数组时会出错,c,pointers,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); } #包括 main(){ int arr[]={1,2,3,4

我尝试了一个带指针算法的代码,但它似乎给出了错误

指向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);
}
#包括
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
的输出完全相同,但事实并非如此。可能的原因是什么

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

但由于C99可以使用复合文本,复合文本允许我们使用给定的初始化值列表创建未命名对象,换句话说,您可以使用对数组的强制转换作为初始值设定项

这样:

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

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

在启用警告的情况下构建,并阅读有关的内容,因为
int*k={1,2,3,4}不会做你认为它会做的事情。
int *k= (int []){1,2,3,4};