我似乎无法理解数组或二维数组上的不同声明之间的区别.
例如:
void swap(char **a, char **b) {
char *t = *a;
*a = *b;
*b = t;
}
int main(int argc, char **argv) {
char a[] = "asher";
char b[] = "saban";
swap(&a,&b);
}
Run Code Online (Sandbox Code Playgroud)
这段代码没有编译,它输出:
warning: passing argument 1 of ‘swap’ from incompatible pointer type
test.c:10: note: expected ‘char **’ but argument is of type ‘char (*)[6]’
Run Code Online (Sandbox Code Playgroud)
是不是a指向char数组的第一个单元格的&a指针,是指向指针的指针?
另一个例子是:
char (*c)[3];
char (*d)[3];
swap(c,d);
Run Code Online (Sandbox Code Playgroud)
不编译.. char (*c)[3]与指针相同char a[] = "ab"?
但是这确实编译:
char *c[3];
char *d[3];
swap(c,d);
Run Code Online (Sandbox Code Playgroud)
所以我完全糊涂了.为什么会有区别?关于这个问题是否有一些规则可以防止我一直误会?
谢谢你们
我认为这是你困惑的根源.
数组变量是固定对象.它指的是一组固定的数组成员.尽管数组成员的值可以,但它无法更改.
在除了作为一元&(地址)的参数之外的所有表达式上下文中,sizeof数组将衰减为指向其第一个元素的指针.
鉴于:
char a[] = "asher";
Run Code Online (Sandbox Code Playgroud)
表达式a将衰减为指向char(char*)的指针,并指向第一个字符a.
表达式&a是指向char(char (*)[])数组的指针.它是指向完整数组的指针,而不是指向第一个字符的指针.它是指向数组第一个字符的指针的不同类型,尽管它与指向数组第一个字符的指针具有相同的值.
然而,无论是表情的a和&a是左值,它们是暂时的指针值.
你不能交换数组,你只能交换指针,但要做到这一点,你需要左值指针,你可以采取其地址.
void swap(char **a, char **b);
int main(int argc, char **argv) {
char a[] = "asher";
char b[] = "saban";
char* pa = a;
char* pb = b;
swap(&pa, &pb);
}
Run Code Online (Sandbox Code Playgroud)