繁体   English   中英

char *和char(*)之间的区别[25]

[英]Difference between char * and char (*)[25]

#include<stdio.h>

int main()
{
    char str[25] = "Hello World";
    printf("%s\n", &str+2);
    printf("%p\n",&str);
    printf("%p\n",&str+2);
    return 0;
}

上面的程序在第6行闪烁了一个错误,说:

warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[25]’ [-Wformat=]

我想知道两者之间有什么区别。 并且输出始终显示两个地址,它们之间的差值为32字节。 当我尝试打印str地址和str +2的地址时,我期望输出的差异为2。 你可以解释吗?

这两种情况的区别非常简单。 假设我们有一个由25个字符组成的数组: char arr[25]; 按照惯例,表达式arr计算指向第一个数组元素的指针,即arr&arr[0] 注意,这里一元运算符&应用于具有char类型的左值arr[0] 结果&给出了一个char *类型的表达式(即char指针)

当我们说&arr左值是arr时,即为char [25] (即25个字符的数组)。 结果,整个表达式的类型为char (*)[25] (即,指向25个字符的数组的指针)。 因此,我们得到的表达式完全是另一种类型,与char *不兼容。

关于索引的一些注释。 &arr + 2&arr之间的差为50个字节(十六进制为0x32),因为sizeof(arr) == 25

char *是指向char的指针,而char (*)[25]是指向25个char的数组的指针,因此这些类型不同,并且编译器正确地发出警告。

此外,由于&strstr数组的地址并且类型为char (*)[25] ,所以&str+2的值将等于:

&str + 2*sizeof(char (*)[25]) = &str + 2*25 = &str + 50 = &str + 0x32

由于指针根据其指向的类型递增。

编辑:OP添加了新行6。

这是打印字符串和指针值的正确语法。 在所有情况下,在&处都不应出现& ,因为对数组标识符的引用会将其衰减为指针。

#include <stdio.h>

int main()
{
    char str[25] = "Hello World";
    printf("%s\n", str+2);
    printf("%p\n", (void*)str);
    printf("%p\n", (void*)(str+2));
    return 0;
}

程序输出:

llo World
0018FF20
0018FF22

编辑2:这显示了传递数组的指针的效果。 编译器认为您正在处理每个大小为25的字符串数组的第三个元素。我试图说明这种未定义的行为是如何实际体现的。

#include <stdio.h>

int main()
{
    char str[25] = "Hello World";
    char abc[] = "abcdefghijklmnopqrstuvwxyz";
    printf("%s\n", &str+2);
    return 0;
}

程序输出:

wxyz

经过一番研究,我得出了这个解释。 &str+2被视为指向数组的指针。 char (*)[25]说这是一个指向大小为25的字符数组的指针。要找到导致输出显示32字节差的原因的解释,我再次运行程序,注意到输出以十六进制显示,即

0x7ffd865b2710
0x7ffd865b2742

当转换为基数10时,它变为50字节的差,这是指向位于当前数组第二位的数组的指针(记住&str + 2)。 为了更加清楚,这是一个小内存图。

&str   -----> current array ie str. array is 25 bytes long.
&str+1 -----> array lies after 1 position to current array. This address is 25 bytes away from &str.
&str+2-----> array lies after 2 position to current array. This address is 50 bytes away from &str.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM