【问题标题】:Printing a string with char pointer in C [duplicate]在C中打印带有char指针的字符串[重复]
【发布时间】:2017-11-15 17:53:58
【问题描述】:

如果是指针,*p 表示存储的值,p 表示地址(对于声明 int *p)。
根据以下声明,name 指向字符串“示例”。所以*name 将是“E”而不是地址,而是实际值。那么下面的程序是如何工作的呢?我的意思是,我们正在增加值本身而不是指针(混淆)。

char *name="Example";
while(*name !='\0'){
    printf("%c\n",*name++);
}

打印

    E
    x
    a
    m
    p
    l
    e 

【问题讨论】:

  • 运算符优先级
  • *name 是“E”(char 值),而不是 "E"(字符串)。但是@Olaf,指向字符串的指针 根据定义是指向其初始字符的指针(C11 7.1.1p1)。
  • @redsoxlost:“除了字符串或字符”是什么意思?这的区别。 'E' 是一个字符常量。 (由于历史原因,它在 C 中的类型为 int;在 C++ 中,它的类型为 char。)"E" 是字符串文字。它在 C 中是 char[2] 类型,在 C++ 中是 const char[2](2 因为终止空字符 '\0')。
  • @redsoxlost:是的,用单引号和双引号括起来的材料在 C 语言中有很大的不同。在提问时,要非常小心你使用的那个——差异很重要!而且我没有用反引号将问题中的“E”括起来,因为那样你的陈述肯定是错误的,而不仅仅是“大部分错误”。在书面英语中随意使用单引号和双引号是可以的(在一定程度上);在讨论 C 的文本中不行。

标签: c


【解决方案1】:

您误解了*name++ 表达式:即使++ 跟在*name 之后,它也仅适用于name,而不适用于*name,因为运算符++ 的优先级高于指针取消引用运算符*

这种优先级规则在 C 程序中非常常用。例如,K&R 的单行strcpy 实现使用了这个表达式两次:

void strcpy( char* dest, const char *src) {
    while (*dest++ = *src++)
        ;
}

【讨论】:

    【解决方案2】:

    递增name++ 的优先级高于取消引用。 *name.

    所以基本上是:*(name++)。相对于:(*name)++

    【讨论】:

      【解决方案3】:

      http://en.cppreference.com/w/c/language/operator_precedence 的表中可以看出,后缀++ 的优先级高于取消引用*。所以发生的情况是,首先对 name++ 求值,这会增加指针,但返回随后调用 operator*(取消引用/间接)的原始地址。

      所以效果是你取消引用指针的当前值但指针随后递增。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-15
        • 2013-07-22
        • 2019-08-06
        • 1970-01-01
        • 2020-08-14
        • 1970-01-01
        相关资源
        最近更新 更多