const char数组名是函数中的const值吗?

时间:2014-04-17 03:48:24

标签: c

s++在函数中有效,

void f(char s[]) {
  s++; // Why it works here?
}

但它不是在主要功能中。它连接到我,因为它具有完全相同的数据类型。

void main() {
  char s[] = "abc";
  s++;  // wrong because it is a const value.
}

为什么?

1 个答案:

答案 0 :(得分:7)

这是因为函数参数s不是字符数组,而是指向字符的指针。您无法将数组传递给函数。实际传递的是指向数组第一个元素的指针。在这个意义上,数组不是C中的第一类对象。因此,以下两个函数原型是等价的 -

void f(char s[]);
// equivalent to
void f(char *s);

这意味着s可以包含任何字符的地址。

void f(char s[]) {
  // s is a pointer to a character.
  // s++ is fine. evaluates to s and
  // makes s point to the next element
  // in the buffer s points to.
  s++; 
  return *s;
}

但是,以下语句将s定义为数组并使用字符串文字对其进行初始化。

char s[] = "abc";

数组和指针是不同的类型。数组s绑定到堆栈上分配的内存位置。它不能反弹到不同的内存位置。 请注意更改变量值和更改变量名称绑定的内存位置之间的区别。在上面的函数中,您只是更改s的内容,但是{ {1}}本身总是指在堆栈上分配的固定内存位置。

s

s++; // in main 函数中的上述语句求值为数组main的基址,即s,其副作用是更改&s[0]的内容}。更改s的内容意味着将变量s绑定到不同的内存位置,这始终是错误。 任何变量在其生命周期内始终引用相同的内存位置。但是它的内容可以改变但是不同。

s