假设我有类似的东西
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,因为它需要一个地址来存储一个字符串?
希望你能理解我的困惑在哪里,谢谢。
答案 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
成员是一个数组。当作为参数传递时,所有数组都会衰减为指针。