指向C中常量的指针

时间:2014-09-22 16:29:36

标签: c pointers

我编译了以下代码:

#include <stdio.h>

int main(void) {
    // your code goes here

    char *consta = "ABC";

    printf("Use of just const: %c\n", consta );
    printf("Use of const[1]: %c\n", consta[1]);
    printf("Use of whole string: %s", consta);

    return 0;
}

但是,我得到的输出是:

Use of just const: P
Use of const[1]: B
Use of whole string: ABC

第二个printf和第三个printf函数调用按预期工作但是,我希望在第一次调用printf时打印'A'而不是'P'。

4 个答案:

答案 0 :(得分:2)

consta是包含字符串地址的指针。

你告诉printf将其视为一个角色,这是一种未定义的行为。指针通常用于将地址存储为数字,因此通常会打印该地址的ASCII值。

您希望通过写*consta来传递该地址的值(指针指向的地址)。

答案 1 :(得分:2)

consta是指向角色的指针。格式说明符%c需要类型char(字符)的参数,而不是char*(指向字符的指针)。您的代码显示未定义的行为。请尝试取消引用consta

printf("Use of just const: %c\n", *consta);

其中*consta绝对等于consta[0]

†实际上,参数的类型为int,并由unsigned char转换为printf()。这与适用于具有可变参数的函数的参数提升规则有关;类型为printf()的{​​{1}}的参数会在传递给char之前提升为int,这就是printf()必须将其推广的原因。对于大多数程序而言,差异并不重要。

答案 2 :(得分:0)

char *consta = "ABC";

指向char的指针指向"ABC",与"ABC"的第1个元素完全相同,即'A'

&#34;指向&#34;表示consta包含地址,此处为'A'的地址。

要打印指针,会说出一个地址,请使用转换说明符%p

printf("Use of just const: %p\n", (void*) consta);

答案 3 :(得分:0)

我可以发现您的代码存在三个问题:

  1. 变量consta指向一个常量字符串,因此您应该将其设为常量:

    const char *consta = "ABC";
    
  2. 第一个print语句的第二个参数应该是字符串中的第一个字符而不是指针:

    printf("Use of just const: %c\n", consta[0]);
    
  3. 在最后一个打印声明中,没有最终换行符。这意味着可能没有输出。

  4. 如果您希望代码符合ANSI C标准,则还需要将行注释(//...)更改为块注释(/*...*/)。

    在编译器中启用所有警告也是一个好主意。使用流行的GCC编译器,我使用以下选项:

    -ansi -fsanitize=address -g -pedantic -Wall -Wfatal-errors