//计算两个复数相乘的结果,就想问一下,使用结构变量的指针进行传参数的,传过去和原来的用法一样吧,这个还好不是结构体作为数组元素,数组元素的话几个都是共用一个首地址的吧,只用定义一个就行了.如果先定义了
struct student{
int age;
...
};
struct student *p;
这个只是声明了他是一个指向结构体变量的指针吧
struct student stu[10];
定义了一个长度为十个的结构数组,
再p = stu;才是真正的让结构体指针有了指向。
遍历是这样吗
(*p++).age 或者 (*p+1).age 相当于朝数组后面进了一位。相当于stu[2].age
还可以用p[2].age
应该可以用的,因为就把它当作数组来看,p[2]相当于 stu[2]
但是下面的好像不能这样,因为是一个的地址,肯定不能用p[2] p[i]什么的了
只能用(*p).age p->age 什么的,也就这两个了,只有数组是比较特殊,p是地址没错。。。。。但p[i]是个什么东西?
想起数组,是定义a[10]; int *p; p=a;等于数组名,数组名就是首地址。但是没见过p[i],没有说 p[2]代表就是a[2]的啊
说p[2]代表 a[2]的地址都好点。难道有这样的定义,不可能。
所以也就没有,struct student *p;
struct student group1[10];(小组一里面都是学生,有十个学生,定义一个结构体变量数组)
p = group1;
p[3].age =18; //第四个人的年龄为18,这样就不对了,因为p[3]是个什么东西
传参数就传过来结构体变量的地址,作为指针。
其实还挺方便的连指针都没定义,就直接&a, 把地址传过去。
但是传地址有危险,运行个函数把外面的原来的值改了。下面的a,b就有这样的风险?虽然代码挺安全的,所以有时候传结构进去,计算结果返回来挺好的。
#include <stdio.h>
typedef struct
{
double rp, ip;
} COMPLEX;
void Input(COMPLEX *p);
void Output(const COMPLEX *p);
COMPLEX Multiply(COMPLEX *p, COMPLEX *q);
int main()
{
COMPLEX a, b, c;
Input(&a);
Input(&b);
c =
Multiply(COMPLEX &a;COMPLEX &b)
;
Output(&c);
return 0;
}
void Input(COMPLEX *p)
{
scanf("%lg %lg",
&(*p).rp,&(*p).ip
);
}
void Output(const COMPLEX *p)
{
printf("%g %g",
(*p).rp,(*p).ip
);
}
COMPLEX Multiply(COMPLEX *p, COMPLEX *q)
{
COMPLEX r;
r.rp =
(p->rp)*(q->rp)+(p->ip)*(q->ip)
;
r.ip =
(p->rp)*(q->ip)+(p->ip)*(q->rp)
;
return r;
c语言结构体,结构体变量,结构体变量数组,和整数数组一样用法
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- b2b160 2023-03-10 23:22关注
//下面这句对的 //计算两个复数相乘的结果,就想问一下,使用结构变量的指针进行传参数的,传过去和原来的用法一样吧,这个还好不是结构体作为数组元素,数组元素的话几个都是共用一个首地址的吧,只用定义一个就行了.如果先定义了 struct student{ int age; ... }; struct student *p; 这个只是声明了他是一个指向结构体变量的指针吧 //对的 struct student stu[10]; 定义了一个长度为十个的结构数组, 再p = stu;才是真正的让结构体指针有了指向。//对的 遍历是这样吗 (*p++).age //对的 或者 //下面这个要括号(*(p+1)).age (*p+1).age 相当于朝数组后面进了一位。相当于stu[2].age 还可以用p[2].age //对的 应该可以用的,因为就把它当作数组来看,p[2]相当于 stu[2] //对的 但是下面的好像不能这样,因为是一个的地址,肯定不能用p[2] p[i]什么的了 只能用(*p).age p->age 什么的,也就这两个了,只有数组是比较特殊,p是地址没错。。。。。但p[i]是个什么东西? 想起数组,是定义a[10]; int *p; p=a;等于数组名,数组名就是首地址。但是没见过p[i],没有说 p[2]代表就是a[2]的啊 说p[2]代表 a[2]的地址都好点。难道有这样的定义,不可能。 所以也就没有,struct student *p; struct student group1[10];(小组一里面都是学生,有十个学生,定义一个结构体变量数组) p = group1; p[3].age =18; //第四个人的年龄为18,这样就不对了,因为p[3]是个什么东西 //上面这个是可以的, p[3]就是p的第四个元素,是p的地址加上p的类型占用的空间大小 也就是 p地址 + sizeof(struct student) 传参数就传过来结构体变量的地址,作为指针。 其实还挺方便的连指针都没定义,就直接&a, 把地址传过去。 但是传地址有危险,运行个函数把外面的原来的值改了。下面的a,b就有这样的风险?虽然代码挺安全的,所以有时候传结构进去,计算结果返回来挺好的。 //传指针比传结构快 #include <stdio.h> typedef struct { double rp, ip; } COMPLEX; void Input(COMPLEX *p); void Output(const COMPLEX *p); COMPLEX Multiply(COMPLEX *p, COMPLEX *q); int main() { COMPLEX a, b, c; Input(&a); Input(&b); c = Multiply(COMPLEX &a;COMPLEX &b) ; Output(&c); return 0; } void Input(COMPLEX *p) { scanf("%lg %lg", &(*p).rp,&(*p).ip ); } void Output(const COMPLEX *p) { printf("%g %g", (*p).rp,(*p).ip ); } COMPLEX Multiply(COMPLEX *p, COMPLEX *q) { COMPLEX r; r.rp = (p->rp)*(q->rp)+(p->ip)*(q->ip) ; r.ip = (p->rp)*(q->ip)+(p->ip)*(q->rp) ; return r;
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥20 关于web前端如何播放二次加密m3u8视频的问题
- ¥20 spring boot集成mqtt的使用问题
- ¥15 使用百度地图api 位置函数报错?
- ¥15 metamask如何添加TRON自定义网络
- ¥66 关于川崎机器人调速问题
- ¥15 winFrom界面无法打开
- ¥30 crossover21 ARM64版本安装软件问题
- ¥15 mymetaobjecthandler没有进入
- ¥15 mmo能不能做客户端怪物
- ¥15 osm下载到arcgis出错