结构体的初始化和引用 & 指向结构体变量的指针变量

本文详细介绍了结构体及结构体数组的概念,并通过实例演示了如何定义、初始化和使用结构体,以及如何通过指针访问结构体成员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、首先我们来了解关于结构体以及结构体数组的概念。

自定义结构体:

struct weapon{
    char name[20];
    int atk;
    int price;
};

它是"weapon"型(类似于我们熟知的int型,String型等),里面有一个char类型,两个int类型。

如何给这个结构体赋值以及访问里面的属性?

    struct weapon weapon_1 = {"weapon_name",100,200};
    printf("%s\n,%d\n",weapon_1.name,++weapon_1.price);

"weapon weapon_1"表示我们实例化了weapon类型的一个具体的对象,我们给它起名为“weapon_1”(类型于int a),并且我们给“weapon_1”赋了三个值{"weapon_name",100,200},这三个值分别对应结构体里的char name[20],int atk,int price。

完整代码如下:

#include<stdio.h>
struct weapon{
    char name[20];
    int atk;
    int price;
};

int main()
{
    struct weapon weapon_1 = {"weapon_name",100,200};
    printf("%s\n,%d\n",weapon_1.name,++weapon_1.price);
    return 0;
}

运行结果:

什么是结构体数组?

    struct weapon weapon_2[2] = {{"weapon_name1",50,100},{"weapon_name2",100,200}};
    printf("%s  %d\n",weapon_2[0].name,weapon_2[1].atk);

struct weapon weapon_2[2]中[2]表示这个数组的大小是2。

完整代码如下:

#include<stdio.h>
struct weapon{
    char name[20];
    int atk;
    int price;
};

int main()
{
    struct weapon weapon_1 = {"weapon_name",100,200};
    printf("%s %d\n",weapon_1.name,++weapon_1.price);

    struct weapon weapon_2[2] = {{"weapon_name1",50,100},{"weapon_name2",100,200}};
    printf("%s %d\n",weapon_2[0].name,weapon_2[1].atk);

    return 0;
}

运行结果:

 二、指向结构体变量的指针变量

 先上代码:

    struct weapon weapon_1 = {"weapon_name",100,200};
    printf("%s %d\n",weapon_1.name,++weapon_1.price);

    struct weapon * w;
    w = &weapon_1;
    printf("name = %s  name = %s\n",(*w).name,w->name);//w->name weapon_1.name

首先我们先定义一个指向weapon类型的指针变量w,然后让w指向weapon_1,现在我们可以通过指向结构体变量的指针w去访问weapon_1。

值得注意的是(*w).name可简写成w->name,它们都表示weapon_1.name。

完整代码如下:

#include<stdio.h>
struct weapon{
    char name[20];
    int atk;
    int price;
};

int main()
{
    struct weapon weapon_1 = {"weapon_name",100,200};
    printf("%s %d\n",weapon_1.name,++weapon_1.price);

    struct weapon * w;
    w = &weapon_1;
    printf("name = %s  name = %s\n",(*w).name,w->name);//w->name weapon_1.name

    return 0;
}

运行结果:

那么结构体数组呢?

    struct weapon weapon_2[2] = {{"weapon_name1",50,100},{"weapon_name2",100,200}};
    printf("%s  %d\n",weapon_2[0].name,weapon_2[1].atk);

    struct weapon * p;
    p = weapon_2;//p->name weapon_2[0].name
    printf("%s\n",p->name);
    p++;//weapon_2 +1 weapon_2[1]
    printf("%s\n",p->name);

可以注意到,“p = weapon_2”中不加“&”。“p = weapon_2”此时表示的是指针p指向的是weapon_2数组第一个元素的起始地址。

如果我们输出p->name,实际它表示的是weapon_2[0].name。

如果想访问weapon_2数组中第二个元素的name成员,应该如何操作?

我们可以将p进行一个 ++的操作,则可以访问weapon_2[1].name。

完整代码如下:

#include<stdio.h>
struct weapon{
    char name[20];
    int atk;
    int price;
};

int main()
{
    struct weapon weapon_2[2] = {{"weapon_name1",50,100},{"weapon_name2",100,200}};
    printf("%s  %d\n",weapon_2[0].name,weapon_2[1].atk);

    struct weapon * p;
    p = weapon_2;//p->name weapon_2[0].name
    printf("%s\n",p->name);
    p++;//weapon_2 +1 weapon_2[1]
    printf("%s\n",p->name);

    return 0;
}

运行结果:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值