C 错误:左值必须为一元‘&’;操作数,I';我见过解决方案,但我能';不要把它们和我的问题联系起来

C 错误:左值必须为一元‘&’;操作数,I';我见过解决方案,但我能';不要把它们和我的问题联系起来,c,string,pointers,function-pointers,C,String,Pointers,Function Pointers,我可以通过将&(name+0)替换为&name[0]或只替换name来轻松删除此错误,但为什么会出现此错误 #include<stdio.h> #include<string.h> void print(char *c) { while(*c != '\0') { printf("%c",*c); c++; } printf("\n"); } int main(void) { char name[]="Hel

我可以通过将
&(name+0)
替换为
&name[0]
或只替换
name
来轻松删除此错误,但为什么会出现此错误

#include<stdio.h>
#include<string.h>

void print(char *c)
{
   while(*c != '\0')
   {
       printf("%c",*c);
       c++;
   } 
   printf("\n");
}
int main(void)
{
    char name[]="Hello World!";
    print(&(name+0)); //ERROR here
    return 0;
}
#包括
#包括
作废打印(字符*c)
{
而(*c!='\0')
{
printf(“%c”,*c);
C++;
} 
printf(“\n”);
}
内部主(空)
{
char name[]=“你好,世界!”;
打印(&(name+0));//此处出错
返回0;
}
使用

print(&(name+0)); //ERROR here
似乎是一些误解的结果

第一件事-为什么这是一个语法错误

(name+0)
的计算结果不是左值。因此,不能获取该表达式值的地址

判断某事物是否为左值的一个简单方法是问问自己:我可以在赋值运算符的LHS上使用它吗?在您的情况下,您必须问:我可以使用吗

(name + 0) = <something>;
使用

print(&(name+0)); //ERROR here
似乎是一些误解的结果

第一件事-为什么这是一个语法错误

(name+0)
的计算结果不是左值。因此,不能获取该表达式值的地址

判断某事物是否为左值的一个简单方法是问问自己:我可以在赋值运算符的LHS上使用它吗?在您的情况下,您必须问:我可以使用吗

(name + 0) = <something>;

&(name+0)
不等同于
&name[0]
&name[0]
&(*(name+0))
相同。请注意,间接,当您使用下标运算符时,它与偏移指针并取消对它的引用相同。

和(name+0)
不等同于
&name[0]
&name[0]
&(*(name+0))
相同。注意间接,当您使用下标运算符时,它与偏移指针和取消引用它相同。

引用第6.3.2.1节第1小节中的C11标准:

左值是一个表达式(对象类型不是void),它 潜在地指定一个对象;如果左值未指定 对象进行计算时,行为未定义。当一个物体 被称为具有特定类型,该类型由左值指定 用于指定对象


在本例中,您得到了表达式
(name+0)
。虽然
name
本身指定了一个对象,因此是一个左值,但该表达式中的添加结果并不指定对象,而是一个值,并且不是左值,因此不符合一元
&
运算符的资格。

引用第6.3.2.1节第1小节中的C11标准:

左值是一个表达式(对象类型不是void),它 潜在地指定一个对象;如果左值未指定 对象进行计算时,行为未定义。当一个物体 被称为具有特定类型,该类型由左值指定 用于指定对象


在本例中,您得到了表达式
(name+0)
。虽然
name
本身指定了一个对象,因此是一个左值,但该表达式中的加法结果并不指定对象,而是一个值,并且不是左值,因此不符合一元
&
运算符的条件。

name+0是一个表达式,类似于2+2。不能取2+2的地址,只能取变量的地址。(&name)+0可以。请尝试打印(name)它可以完成这项工作,但我要问的是,为什么在这种特殊情况下会出现这种错误??name+0是一个表达式,就像2+2一样。不能取2+2的地址,只能取变量的地址。(&name)+0可以。请尝试打印(name)它可以完成工作,但我在问为什么我会在这个特殊情况下出现这个错误??