Я думаю, что это источник вашей путаницы.
Переменная массива - это фиксированный объект.Это относится к фиксированному набору членов массива.Его нельзя изменить, хотя значения членов массива могут.
Во всех контекстах выражений, кроме как в качестве аргумента унарных &
(address of) и sizeof
, массив превратится в указатель наего первый элемент.
Дано:
char a[] = "asher";
Выражение a
затухает до указателя на символ (char*
) и будет указывать на первый символ a
.
Выражение &a
является указателем на массив char (char (*)[]
).Это указатель на полный массив, а не указатель на первый символ.Это тип, отличный от указателя на первый символ массива, хотя он будет иметь то же значение, что и указатель на первый символ массива.
Однако ни одно из выражений a
и &a
являются lvalues , они являются временными значениями указателей.
Вы не можете поменять местами массивы, вы можете только поменять местами указатели, но для этого вам нужно lvalue указатели, адрес которых выможно взять.
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);
}