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

时间:2013-11-19 11:04:21

标签: 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 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,因为它需要一个地址来存储一个字符串?

希望你能理解我的困惑在哪里,谢谢。

3 个答案:

答案 0 :(得分:2)

点运算符与此无关。

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

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

  strcpy(string, "Earth");

  return 0;
}

以上是100%自然和精细的C代码,它依赖于这样的事实:在某些上下文中,数组的名称(string)仅仅是指向第一个参数的指针。

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

你的字符串嵌入在struct中的事实与此无关。

答案 1 :(得分:2)

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

在第

strcpy(one_planet.name, "Earth"); 

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

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

答案 2 :(得分:1)

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