ссылаясь на массивы как указатели - PullRequest
2 голосов
/ 02 октября 2010

Я не могу понять разницу между различными объявлениями в массиве или 2d массиве.
например:

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);
}

этот код не компилируется, он выводит:

warning: passing argument 1 of ‘swap’ from incompatible pointer type
test.c:10: note: expected ‘char **’ but argument is of type ‘char (*)[6]’

не является a указателем на первую ячейку массива символов, а &a является указателем на указатель?

другой пример:

char (*c)[3];  
char (*d)[3];  
swap(c,d);

тоже не компилируется .. char (*c)[3] совпадает с указателем на char a[] = "ab"?

Однако это компилируется:

char *c[3];
char *d[3];
swap(c,d);

так что я в полном замешательстве. Почему есть разница? Есть ли какие-то правила по этому вопросу, чтобы я не ошибался все время?

Спасибо всем

1 Ответ

9 голосов
/ 02 октября 2010

Я думаю, что это источник вашей путаницы.

Переменная массива - это фиксированный объект.Это относится к фиксированному набору членов массива.Его нельзя изменить, хотя значения членов массива могут.

Во всех контекстах выражений, кроме как в качестве аргумента унарных & (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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...