gpt4 book ai didi

c - 'char *' 和 'char (*) [100]' 有什么区别?

转载 作者:行者123 更新时间:2023-12-04 11:56:10 25 4
gpt4 key购买 nike

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

我不明白为什么会出现这个警告?如果我将 (word) 传递给函数,则没有警告,但是当我执行以下代码时,输​​出是相同的:

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 - %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

关于c - 'char *' 和 'char (*) [100]' 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60690774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com