Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C结构和;Strcpy,点运算符是否解析为指针_C_Arrays_Pointers_Struct - Fatal编程技术网

C结构和;Strcpy,点运算符是否解析为指针

C结构和;Strcpy,点运算符是否解析为指针,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,假设我有这样的东西 typedef char string[21] struct planet_s { string name,orbits; float distance; string discoverer; int yeardiscovered; }one_planet; 接下来我需要初始化一些关于这个星球的信息,所以我的课本上说 strcpy(one_planet.name, "Earth"); ?confused with t

假设我有这样的东西

typedef char string[21]    

struct planet_s
{
    string name,orbits;
    float distance;
    string discoverer;
    int yeardiscovered;
}one_planet;
接下来我需要初始化一些关于这个星球的信息,所以我的课本上说

strcpy(one_planet.name, "Earth");         ?confused with these
strcpy(one_planet.orbits, "Sun");         ?
one_planet.distance = 150;
one_planet.mass = 6.00e+24;
strcpy(one_planet.discoverer, "me");     ?
one_planet.yeardiscovered = 1000;
我的困惑出现在strcpy中,让我用点的形式来表达

Strcpy
需要一个指向字符串的指针作为其第一个参数

one_planet.name
是否解析为指向struts name数组的指针(点运算符是否解析为地址)

为什么
one_planet.distance=150
不能解析为地址,因为我们会直接给它赋值?这就是我学到的,一个行星距离直接访问struct元素并分配它。我的困惑在于strcpy,因为它需要一个地址来存储字符串


希望您能理解我的困惑来自于感谢。

点运算符与此无关

将您的代码与此进行比较:

int main(void)
{
  char string[21];

  strcpy(string, "Earth");

  return 0;
}
上面的代码是100%自然、精细的C代码,它依赖于这样一个事实:在某些上下文中,数组的名称(
string
)的计算结果只是指向第一个参数的指针

换句话说,上面的
字符串
被计算为与表达式
&string[0]
完全相同的地址值


字符串嵌入到结构中的事实与此无关。

不,创建指针的不是“点运算符”
,这是因为
轨道
成员是一个数组。当作为参数传递时,所有数组都会衰减为指针。

除非它是
sizeof
或一元
&
运算符的操作数,或者当它是用于初始化声明中另一个数组的字符串文字时,“N-element array of
T
”类型的表达式将被转换(“衰减”)指向类型为“指针指向
T
”的表达式,表达式的值将是数组中第一个元素的地址

排队

strcpy(one_planet.name, "Earth"); 
表达式
one_planet.name
的类型为“char的21元素数组”;由于表达式不是
sizeof
或一元
&
运算符的操作数,它被转换为类型为“指针指向
char
”的表达式,数组的第一个元素的地址被传递到
strcpy


在这种情况下,
操作符不会产生任何影响;重要的是成员的类型,而不管如何访问该成员

@Adriano不,有一个非常C-ish的
typedef
,它将字符数组别名为名称
string
。@unwind完全忽略了这一点@Adriano有一个
typedef
可能看起来像
typedef char[21]字符串
typedef char*字符串
。您正在使用
std::string
c++
得出结论。但是代码本身。。。是的,它离。。。甚至可以工作。@luk32:实际上,
typedef char string[21]
是正确的。欢迎来到C@哦,我原来是
C
的浪子。在我到达
typedef
ing恒定大小的向量之前,我漫游到了
std::
s的土地。谢谢你的纠正,每天都有新的东西要学。我认为OP在理解
c
语法方面有很大的困难,而且你对
string
的含义改变了很多。现在它可能会变得非常混乱。尤其是当您鼓励比较代码时。也许离开
typedef
会更有用。。。虽然我不擅长教编程。只是个主意。