【问题标题】:Why does pointer arithmetic gives an error when assigned to direct array [duplicate]为什么分配给直接数组时指针算术会出错[重复]
【发布时间】:2019-07-19 08:05:20
【问题描述】:

我正在尝试使用指针算法的代码,但它似乎给出了错误。

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

【问题讨论】:

  • 在启用警告的情况下构建并阅读有关comma operator 的信息,因为int *k={1,2,3,4}; 并没有按照您的想法进行。

标签: c pointers


【解决方案1】:

指针不是数组,您不能使用相同的语法来初始化它们,在第一种情况下 p points 指向数组第一个元素的地址,而在第二种情况下,您将1(列表的第一个值)作为指针的值分配,因此k points 指向地址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};

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 2020-11-13
      • 1970-01-01
      • 2017-03-28
      • 2018-07-20
      • 2021-11-21
      相关资源
      最近更新 更多