在C中打印带有字符指针的字符串

在C中打印带有字符指针的字符串,c,C,对于指针,*p表示存储的值,p表示地址(对于声明int*p)。 根据下面的声明,name指向字符串“Example”。因此,*name将是“E”,而不是地址,而是实际值。那么下面的程序是如何工作的呢?我的意思是,我们增加的是值本身,而不是指针(混淆) 打印 E x a m p l e 您误解了*name++表达式:尽管++后面跟着*name,但它仅适用于name,而不是*name,因为运算符++的优先级高于指针解引用运算符* 这种优先规

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

打印

    E
    x
    a
    m
    p
    l
    e 

您误解了
*name++
表达式:尽管
++
后面跟着
*name
,但它仅适用于
name
,而不是
*name
,因为运算符
++
的优先级高于指针解引用运算符
*

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

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

递增的
name++
比取消引用具有更高的优先级<代码>*名称


所以它基本上是:
*(name++)
。与:
(*name)+

相反,正如您在中的表中所看到的,后缀
++
的优先级高于取消引用
*
。因此,首先计算
name++
,它增加指针,但返回原始地址,然后调用
operator*
(取消引用/间接寻址)


因此,其效果是取消引用指针的当前值,但指针随后会递增。

运算符优先级
*name
是“E”(一个
字符
值),而不是
的“E”(一个字符串)。但是@Olaf,根据定义,指向字符串的指针就是指向其初始字符(C117.1.1p1)的指针。@redsoxlost:“除了字符串或字符”是什么意思?这就是区别<代码>'E'
是一个字符常量。(由于历史原因,C中的类型为代码< int /c> >;在C++中,它是类型<代码> char 。)代码> e”< /COD>是字符串文字。在C++中,代码类型<代码> Car(2)< /> > C,<代码> const char [2 ] < /C> >(2,因为终止null字符<代码> \' 0’/代码>)@是的,在单问和双引号中的包围材料在问问题时在C.有很大的差别,请小心使用-差异非常重要!我没有把问题中的“E”放在后面的勾中,因为那样的话,你的陈述肯定是错误的,而不仅仅是“大错特错”。在书面英语中随意使用单引号和双引号是可以的(在一定程度上);在课文中讨论C是不合适的。
void strcpy( char* dest, const char *src) {
    while (*dest++ = *src++)
        ;
}