C “有什么用?”*&&引用;在下面的代码中

C “有什么用?”*&&引用;在下面的代码中,c,C,printf语句中的*&有什么用途?输出如何R #include <stdio.h> int main() { char* str = "ReplyCodeChallenge"; printf("%c\n", *&*str); return 0; } #包括 int main(){ char*str=“ReplyCodeChallenge”; printf(“%c\n”、*&*str); 返回0; } 并且输出为:Rchar*str=“reply

printf
语句中的
*&
有什么用途?输出如何
R

#include <stdio.h>

int main() {
    char* str = "ReplyCodeChallenge";
    printf("%c\n", *&*str);
    return 0;
}
#包括
int main(){
char*str=“ReplyCodeChallenge”;
printf(“%c\n”、*&*str);
返回0;
}
并且输出为:R

char*str=“replycodecharchallenge”
str
定义为指向
char
的指针,并将其初始化为指向
“ReplyCodeChallenge”
的第一个字符。(
“ReplyCodeChallenge”
是一个字符串文字,实际上是一个数组。在这种使用中,它会自动转换为指向其第一个元素的指针,该指针用作
str
的初始值)

str
是指向
char
的指针,它指向
'R'

*str
就是
char
,因为
*
给出了指针(地址)指向的东西

&*str
是该
字符的地址,因为
&
给出了一个对象的地址(指针)


*&*str
就是
char
,同样是因为
*
给出了指针指向的东西。

这只是一个多重引用和取消引用的问题

str
是一个字符串指针

*str
相当于
*(str+0)
,与
str[0]

&(*str)
表示
str[0]

*(&*str)
只需取消对该地址的引用,并将
str[0]
返回给您

括号在这里并不重要,因为
&
*
都属于同一优先组,它们的关联性是从右到左的

因为
str[0]
是“R”,所以这是您的输出


通过本例,您可以得出结论,
*&
或(
*&*&
..)没有显著差异。但并非总是如此,您可能会看到函数头中使用的语法通过引用传递机制接收指针类型的参数。

*
-取消引用指针引用的对象
&
-获取对对象的引用

char*p=“ABCD;
-
&*p
&*&*p
&*&*&*p
&*&*&*&*p
…-不做任何事情,它仍然是存储在指针中的引用

*&*p
*&*&*p
*&*&*&*p
*&*&*&*&*p
。-只需取消引用指针
p
引用的
字符,在这种情况下
'A'


已经有足够多的好答案了,但我也添加了我的答案——就像在任何表达式中一样,首先需要在解析树中拆分它,以便检测子表达式的求值顺序

*&*str

这里有2个一元运算符的3个应用程序,每个都是 前缀一元运算符。所以它们具有相同的优先级,所以解析树如下

(*(&(*str)))

第一个应用程序
*(str)
将返回
str
开头的第一个字符,该字符与
str
本身具有相同的地址。因此,
和*str
将是
str
的地址。因此,您的应用程序将减少到

*str


第1个字符(表示ASCII码的整数)从字符串中。

它让我想起了我的大学时代,看起来像是作业问题。荒谬的混淆。它是无用的。
*&*str
*str
相同。也许你可以澄清你的上一句话,我想我知道你在说什么,但它与数组没有多大关系,它们有地址,这些地址可以是取消引用,元素具有可以取消引用的地址。作为指针的数组元素可以取消引用,因此粗体的“它不适用于数组”用词很有趣。@GradyPlayer您可以注释一些不再存在的内容