C 为什么指针算法在分配给直接数组时会出错
我尝试了一个带指针算法的代码,但它似乎给出了错误 指向arr的指针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
*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};