В чем разница между char * и char (*) [100]? - PullRequest
3 голосов
/ 15 марта 2020
int main()
{
    char word[100];
    char* lowerCase;

    scanf("%s", word);

    lowerCase = toLowerCase(&word);
    printf("%s", lowerCase);
}

char * toLowerCase(char *str)
{
    int i;

    for(i = 0; str[i] != '\0'; ++i)
    {
        if((str[i] >= 'A') && (str[i] <= 'Z'))
        {
            str[i] = str[i] + 32;
        }
    }

    return str;
}

Я получаю предупреждение при выполнении кода выше. предупреждение

try.c: In function 'main':
try.c:16:26: warning: passing argument 1 of 'toLowerCase' from incompatible pointer type [-Wincompatible-pointer-types]
  lowerCase = toLowerCase(&word);
                          ^~~~~
try.c:4:7: note: expected 'char *' but argument is of type 'char (*)[100]'
 char* toLowerCase(char *str);

Я не могу понять, почему появляется это предупреждение? если я передаю (слово) в функцию, предупреждение отсутствует, но когда я выполняю следующий код, вывод такой же:

printf("%d", word);
printf("%d", &word);

Если адрес такой же, тогда почему это предупреждение?

1 Ответ

4 голосов
/ 15 марта 2020

char x[100]

Массив x распадается на указатель:

x - указатель на символ (char *)

&x - указатель на массив из 100 символов (char (*)[100]);

&x[0] - указатель на символ (char *)

все эти указатели ссылаются на одно и то же начало массива, отличается только тип . Тип имеет значение !!.

Вы не должны передавать &x функциям, которые ожидают (char *) параметров.

Почему тип имеет значение?:

char x[100];

int main()
{
    printf("Address of x is %p, \t x + 1 - %p\t. The difference in bytes %zu\n", (void *)(x), (void *)(x + 1), (char *)(x + 1) - (char *)(x));
    printf("Address of &x is %p, \t &x + 1 - %p\t. The difference in bytes %zu\n", (void *)(&x), (void *)(&x + 1), (char *)(&x + 1) - (char *)(&x));
    printf("Address of &x[0] is %p, \t &x[0] + 1 - %p\t. The difference in bytes %zu\n", (void *)(&x[0]), (void *)(&x[0] + 1), (char *)(&x[0] + 1) - (char *)(&x[0]));
}

Результат:

Address of x is 0x601060,    x + 1 - 0x601061   . The difference in bytes 1
Address of &x is 0x601060,   &x + 1 - 0x6010c4  . The difference in bytes 100
Address of &x[0] is 0x601060,    &x[0] + 1 - 0x601061   . The difference in bytes 1

https://godbolt.org/z/SLJ6xn

...