关于字符串的字符指针的说明

时间:2016-05-18 21:46:58

标签: c arrays string pointers character

嗨,我是编程新手。 在下面的代码中,str是一个指向字符的指针,因此str应该包含字符'h'的地址。因此,%p应该用于打印该地址。但我不明白%s是如何用于打印指针参数的。

    #include<stdio.h>

    int main (){
    char s[] = "hello";
    char *str = s;
    int a[] = {1, 2, 3, 4, 5};
    int *b = a;
    printf("%s\n", str);        // I don't understand how this works ? 
    printf("%c\n", *str);       // This statement makes sense
    printf("%c\n", *(str + 1)); // This statement also makes sense.
    printf("%p\n",str);         // This prints the address of the pointer str. This too makes sense.
    printf("%d\n",*b);          // makes sense, is the same as the second print.
    //      printf("%d",b);     // I don't understand why str pointer works but this gives a compile error
    return 0;
}

1 个答案:

答案 0 :(得分:4)

char s[] = "hello";

声明一个名为s的零终止字符数组。它和写作一样

char s[6] = { 'h', 'e', 'l', 'l', 'o', '\0' };

如您所见,引号是简写。

char *str = s;

这声明str是一个指向角色的指针。然后,它会str指向s中的第一个字符。换句话说,str包含s中第一个字符的地址。

int a[] = {1, 2, 3, 4, 5};

声明一个整数数组。它将它们初始化为1-5,包括值。

int *b = a;

声明b是指向int的指针。然后,它使b指向a中的第一个int。

printf("%s\n", str);

%s说明符接受字符串中第一个字符的地址。 printf然后从该地址开始,打印它看到的字符,直到最后看到\0字符。

printf("%c\n", *str);

这将打印str中的第一个字符。由于str指向一个字符(字符串中的第一个字符),因此*str应该获得指向的字符(字符串中的第一个字符)。

printf("%c\n", *(str + 1));

这会打印str中的第二个字符。这是编写str[1]的漫长道路。这背后的逻辑是指针算法。如果str是字符的地址,则str + 1是数组中下一个字符的地址。由于(str + 1)是地址,因此可以取消引用。因此,*获得超过数组第一个字符的字符1字符。

printf("%p\n",str);

%p说明符需要一个指针,就像%s一样,但它会做其他事情。它不是打印字符串的内容,而是以十六进制格式打印指针所包含的地址。

printf("%d\n",*b);

这将打印int指向的数组中的第一个b。这相当于写b[0]

printf("%d",b);

bint *,而不是int,这是%d所期望的。如果您尝试打印数组的第一个元素的地址,则说明符为%p,而不是%d。此外,此行不应生成编译器错误。相反,它应该是运行时未定义的行为,因为编译器不知道printf格式字符串是什么。