【问题标题】:Isn't Array name a constant pointer, which can't be used in pointer arithmetic, so why does this program work?Array name 不是一个常量指针,不能用在指针运算中,那么这个程序为什么会起作用呢?
【发布时间】:2021-12-13 21:08:38
【问题描述】:

下面的 C 程序给我的输出为b,但是由于数组名称默默地“衰减”成一个常量指针,所以为什么下面的程序可以工作,它应该给出一个错误,说需要 l 值,即。在 LHS 上赋值需要一个变量指针?

void check(){
  char a[10]; 
  a[0] = 'a'; 
  a[1] = 'b'; 
  a[2] = 'c'; 
  f(a);
} 

void f(char a[]){
  a++; 
  printf("%c",*a);
}

编辑:

现在我做同样的事情,但不是在不同的函数中,我在更新代码后得到错误。

void check(){
  char a[10]; 
  a[0] = 'a'; 
  a[1] = 'b'; 
  a[2] = 'c'; 
 // f(a); 
  a++; 
  printf("%c",*a);
}

source_file.c: In function ‘check’:
source_file.c:73:4: error: lvalue required as increment operand
   a++;
    ^~

【问题讨论】:

  • 将数组传递给函数时,数组到指针的衰减正是发生的情况。声明为char a[] 的参数实际上是char *a。注意指针不是常量。
  • a in f() 是一个局部变量。分配给它不会修改check() 中的数组。
  • char *b = a;一样。你可以增加b
  • @Barmar 正是我的观点,我们可以执行 char *b = a 然后 b++ 的原因是因为 b 不是常量指针。
  • 同样的原因你可以有例如const int a = 10; int b = a; b++;你将值复制到一个新变量中,而新变量不是常量。

标签: arrays c pointers char


【解决方案1】:

在代码中

void f(char a[]){
  a++; 
  printf("%c",*a);
}

a 不是一个数组——它是一个指针。在函数参数声明的上下文中,T a[N]T a[] 被“调整”为T *a - 所有三个都将a 声明为指向T 的指针,而不是T 的数组。

当您使用数组参数调用 f 时:

f(a);

表达式 a“衰减”从类型“int”的10个元素数组到“指向int的指针”,所以f实际上接收的是一个指针,不是数组对象。完全等同于写作

f( &a[0] );

在代码中

void check(){
  char a[10]; 
  a[0] = 'a'; 
  a[1] = 'b'; 
  a[2] = 'c'; 
 // f(a); 
  a++; 
  printf("%c",*a);
}

a数组表达式,不是指针,数组类型的表达式不能是++的操作数。

【讨论】:

  • 谢谢约翰,我明白了
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多