将数组称为指针

Ash*_*ban 2 c arrays pointers

我似乎无法理解数组或二维数组上的不同声明之间的区别.
例如:

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)

所以我完全糊涂了.为什么会有区别?关于这个问题是否有一些规则可以防止我一直误会?

谢谢你们

CB *_*ley 9

我认为这是你困惑的根源.

数组变量是固定对象.它指的是一组固定的数组成员.尽管数组成员的值可以,但它无法更改.

在除了作为一元&(地址)的参数之外的所有表达式上下文中,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)