s++
在函数中有效,
void f(char s[]) {
s++; // Why it works here?
}
但它不是在主要功能中。它连接到我,因为它具有完全相同的数据类型。
void main() {
char s[] = "abc";
s++; // wrong because it is a const value.
}
为什么?
答案 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