programmecantrun 2023-03-10 21:32 采纳率: 84.2%
浏览 24
已结题

c语言结构体,结构体变量,结构体变量数组,和整数数组一样用法

//计算两个复数相乘的结果,就想问一下,使用结构变量的指针进行传参数的,传过去和原来的用法一样吧,这个还好不是结构体作为数组元素,数组元素的话几个都是共用一个首地址的吧,只用定义一个就行了.如果先定义了
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;
  • 写回答

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;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月29日
  • 已采纳回答 6月21日
  • 创建了问题 3月10日

悬赏问题

  • ¥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出错