【问题标题】:Confused C pointer behavior [duplicate]混淆的 C 指针行为 [重复]
【发布时间】:2015-11-10 09:31:26
【问题描述】:
#include <stdio.h>

void printa(char *a[])
{
    for (int i = 0; i < 3; ++i) {       
        printf("%s\n", *a);
        a++;
    }   
}

int main(void)
{
    char *a[] = {"The first", "The second", "The third"};

    for (int i = 0; i < 3; ++i) {
        printf("%s\n", *a); 
        a++; // error: cannot increment value of type 'char *[3]'
    }

    printa(a); //OK 

    return 0;
}

因此,我的问题是为什么 main 函数中的代码 a++ 会导致编译错误(错误:无法增加 'char *[3]' 类型的值)。但是,如果我将指针数组传递给函数printa 并在该指针上调用a++,它就可以完美运行。

谢谢,

【问题讨论】:

  • A 是一个数组,其中每个元素都是一个指向 char 的指针....所以 a++ 会失败

标签: c arrays pointers arguments


【解决方案1】:

后缀++ 不能有数组类型的操作数。在main 函数中a 的类型是char *[3],即一个指向char 的指针的数组,而在函数printa 中它是@ 类型987654327@。

作为函数参数

char *a[]  

等价于

char **a  

【讨论】:

  • 你的意思是一个数组作为指针传递给函数。因此,char a[] 等价于char *achar *a[] 等价于char **a
  • @Linh 是的,它是在传入函数时。
  • 是的。确切地。当数组传递给函数时,指向其第一个元素的指针会传递给该函数。
  • 如果你谈到函数 arg 那么是的,但函数内部 a[] 与 a* 不同,不是。第一个是数组,第二个是指针
  • 为什么我们不能在数组类型上++?是不是因为a是数组的基础,所以我们可以改变它?
【解决方案2】:

仅仅是因为数组名称是不可修改的左值。不能在任何表达式中用作左操作数。因此,您不能将其保留在 = 表达式的左侧,或使用自增运算符对其进行自增

【讨论】:

    【解决方案3】:

    当您调用 printa 函数时,参数现在是另一个 char ** 类型的变量。您可以增加该变量。

    但是在main里面,你不能修改a作为数组的基本位置。否则你会得到 I-Value 错误。

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 2011-09-04
      • 2016-11-08
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2014-11-18
      • 2023-02-11
      相关资源
      最近更新 更多