繁体   English   中英

C Struct&Strcpy,点运算符将其解析为指针

[英]C Struct & Strcpy, dot operator does it resolve into a pointer

假设我有这样的东西

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解析为指向strcuts名称数组的指针(点运算符是否解析为地址)?

为什么one_planet.distance =150不能解析为地址,因为我们直接为其分配了值? 这就是我所教的,one_planet.distance直接访问struct元素并分配它。 我对strcpy感到困惑,因为它需要一个地址来存储字符串?

希望你能理解我的困惑来自哪里。

点运算符与此无关。

比较您的代码与此:

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

  strcpy(string, "Earth");

  return 0;
}

上面的代码是100%自然且优良的C代码,它依赖于以下事实:在某些情况下,数组名( string )的计算结果只是指向第一个参数的指针。

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

您的字符串嵌入在结构内部的事实与此无关。

除非它是sizeof的操作数或一元&运算符,或者它是用于在声明中初始化另一个数组的字符串文字,否则将转换类型为“ T N元素数组”的表达式(“ decay” )到类型为“指向T指针”的表达式,该表达式的值将是数组中第一个元素的地址。

在行中

strcpy(one_planet.name, "Earth"); 

表达式one_planet.name类型为“ 21个char数组”; 由于该表达式不是sizeof或一元&运算符的操作数,因此它将转换为类型为“指向char指针”的表达式,并将数组第一个元素的地址传递给strcpy

. 在这种情况下,运算符没有任何区别; 重要的是成员的类型,无论如何访问该成员。

不,它不是“点运算符” . 创建指针的原因是,例如, orbits成员是一个数组。 当作为参数传递时,所有数组都会衰减到指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM