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

时间:2016-06-19 11:23:57

标签: c pointers

#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。你能解释一下吗?

4 个答案:

答案 0 :(得分:3)

这两种情况的区别很简单。假设我们有一个包含25个字符的数组:char arr[25];。按照约定,表达式arr被评估为指向第一个数组元素的指针,即arr&arr[0]相同。请注意,此处的一元运算符&适用于类型为arr[0]的左值char。结果&给出了一个类型为char *的表达式(即指向char的指针)

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

关于索引的几点注意事项。 &arr + 2&arr之间的差异为50个字节(十六进制为0x32),因为sizeof(arr) == 25

答案 1 :(得分:1)

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

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

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

因为指针根据它指向的类型递增。

答案 2 :(得分:0)

编辑:在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

答案 3 :(得分:0)

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

0x7ffd865b2710
0x7ffd865b2742

当转换为基数10时,它变为50个字节的差异,这是指向位于当前数组第二位的数组的指针(记住&amp; 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.