c语言 - 'char *' 和"字符 (*) [100]"有什么区别?


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] != ''; ++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);

如果地址相同,那么为什么会出现此警告?

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 - %pt. The difference in bytes %zun", (void *)(x), (void *)(x + 1), (char *)(x + 1) - (char *)(x));
printf("Address of &x is %p, t &x + 1 - %pt. The difference in bytes %zun", (void *)(&x), (void *)(&x + 1), (char *)(&x + 1) - (char *)(&x));
printf("Address of &x[0] is %p, t &x[0] + 1 - %pt. The difference in bytes %zun", (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

最新更新