【发布时间】:2017-05-31 03:03:28
【问题描述】:
下面是C语言代码:
void test1(void);
int main(){
test1();
return 0;
}
void test1(void){
char c,
*p = &c,
*sp1[3] = {"this 1","this 2", "this 3"}, //pointers array
(*sp2)[5] = {"this 1","this 2", "this 3"},
//2 dimensions array declaration in method 1
sp3[][5] = {"this 1","this 2", "this 3"};
//2 dimensions array declaration in method 2
p++; //ok
sp1++; //error
sp2++; //ok
sp3++; //error
}
我读过指针是一个变量,所以增量是可以的,但数组名不是变量,所以赋值是不可接受的。
在上面的代码中,p是一个指针,所以增量是对的; sp1,sp3都是数组名,自增会报错,但是为什么sp2可以呢?
在同一本书中,有如下功能:
//print lines
void writelines(char *lineptr[],int nlines){
while(--nlines >= 0){
printf("%s\n",*lineptr++);
}
}
在这个函数中,lineptr 是一个数组的名称,但是在它上面应用了一个增量。为什么?是不是因为C中参数是按值转换的,所以lineptr其实是一个指针?
【问题讨论】:
-
stackoverflow.com/questions/581657/… 这可能会帮助您更清楚地理解指针。
-
*sp1[3]是 指向 char 的指针数组,(*sp2)[5]是 指向 char 类型数组 5 的指针,sp3[][5]是一个二维数组(数组数组 char[5])。 注意:,在最后两种情况下,当您未能提供足够的存储空间时,您都会调用未定义的行为,例如"this 2"(对于 nul-terminating char 是 6 个字符 + 1 个字符)。您的5至少需要为7。 -
char c将c声明为 未初始化 字符。*p = &c创建p作为 指向 char 的指针(只有 1 个字符的存储空间),p++;导致p指向为c分配的存储空间之外,任何尝试取消引用p会调用未定义的行为。 -
"在这个函数中 lineptr 是一个数组的名称" -- 是和不是。
lineptr可能是一个 指针数组,每个指针指向nlines行之一的开头,但是当作为参数传递给函数时,数组被转换为 指针,所以您在函数中实际拥有的是一个 指向 char 指针的指针 或char **,您可以轻松地递增它。 (如果是二维数组,参数应该是char (*lineptr)[WIDTH], int nlines...)