混淆 C 指针行为
Confused C pointer behavior
#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]'的值)。但是,如果我将指针数组 a 传递给函数 printa
并在该指针上调用 a++
,它会完美地工作。
谢谢,
仅仅是因为数组名称是不可修改的左值。不能在任何表达式中用作左操作数。因此,您不能将它保留在 =
表达式的左侧,或使用递增运算符
递增它
后缀 ++
不能有数组类型的操作数。 main
函数中a
的类型是char *[3]
,即一个数组指向char
而在函数 printa
中它的类型是 char **
。
作为函数参数
char *a[]
等同于
char **a
当您调用 printa 函数时,参数现在是另一个 char ** 类型的变量。您可以增加该变量。
但是在main里面,你不能修改a作为数组的基地址。否则你会得到 I-Value 错误。
#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]'的值)。但是,如果我将指针数组 a 传递给函数 printa
并在该指针上调用 a++
,它会完美地工作。
谢谢,
仅仅是因为数组名称是不可修改的左值。不能在任何表达式中用作左操作数。因此,您不能将它保留在 =
表达式的左侧,或使用递增运算符
后缀 ++
不能有数组类型的操作数。 main
函数中a
的类型是char *[3]
,即一个数组指向char
而在函数 printa
中它的类型是 char **
。
作为函数参数
char *a[]
等同于
char **a
当您调用 printa 函数时,参数现在是另一个 char ** 类型的变量。您可以增加该变量。
但是在main里面,你不能修改a作为数组的基地址。否则你会得到 I-Value 错误。