【问题标题】:*(a++) is giving error but not *(a+1)?? where a is array name?*(a++) 给出错误但不是 *(a+1)??数组名称在哪里?
【发布时间】:2013-05-09 06:59:03
【问题描述】:

在以下代码中:

void main()
{
    char a[]={1,5,3,4,5,6};
    printf("%d\n",*(a++)); //line gives error: wrong type argument to increment
    printf("%d\n",*(a+1));
}

第 4 行和第 5 行有什么区别。第 5 行我没有收到任何错误或警告。

【问题讨论】:

  • 我的 C 语言不太好,但也许你不能对数组进行双增量(即++ 运算符)。
  • 完全偏离主题但void main() == 糟糕!当你想到void main() 时,想象有人用棍子打你。 int main(),永远!

标签: c arrays pointers


【解决方案1】:

a 是一个数组对象而不是一个指针,所以你不能使用操作a++ 对于数组对象。因为这相当于:

a = a+ 1;

在这里,您为数组对象分配了一个 C 中不允许的新值。

a + 1 返回指向 a 数组的元素 1 的指针,这是允许的

【讨论】:

    【解决方案2】:

    好吧,严重错误的编码实践:但是,让我们首先解决您的问题:

    printf("%d\n",*(a++)); //this lines gives error: wrong type argument to increment
    

    不能使用,因为 a 是对数组的隐式引用;

    你可以这样做:

    char b[]={1,5,3,4,5,6};
    char *a = b;
    printf("%d\n",*(a++)); //this lines will not give errors any more
    

    你走吧……

    另外,*(a++)*(a+1) 不同,因为++ 尝试修改操作数,而+ 只是在常量a 值上加一。

    【讨论】:

    • 同样a++ 计算为a 的旧值并且a 的存储值递增(后递增)
    【解决方案3】:

    'a' 表现得像一个 const 指针。 'a' 不能改变它的值或它指向的地址。这是因为编译器静态分配了数组大小的内存,而您正在更改它所引用的地址。

    你可以改为如下方式

    void main()
    {
    char a[]={1,5,3,4,5,6};
    char *ch;
    ch=a;
    printf("%d\n",*(ch++)); //this lines gives error no more
    printf("%d\n",*(ch+1));
    }
    

    【讨论】:

    • @H2CO3 我说“假设”a 是一个常量指针。我没有称它为 const 指针。
    • a 是数组引用,存储数组第一个成员的地址。我可以安全地“假设”它是一个 const 指针
    • 不,你不能。此外,数组不是指针。这是一个数组。这不是因为它是您无法分配给它的指针。这是因为禁止分配给数组。它不必是常量。它只是不可修改的左值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    相关资源
    最近更新 更多