结构体的初始化和引用及指向结构体变量的指针变量(C语言)

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

自定义结构体:

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
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;
}

运行结果:

结构体的初始化和引用及指向结构体变量的指针变量(C语言)_第1张图片

什么是结构体数组?

    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
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;
}

运行结果:

结构体的初始化和引用及指向结构体变量的指针变量(C语言)_第2张图片

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

 先上代码:

    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
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;
}

运行结果:

结构体的初始化和引用及指向结构体变量的指针变量(C语言)_第3张图片

那么结构体数组呢?

    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
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;
}

运行结果:

结构体的初始化和引用及指向结构体变量的指针变量(C语言)_第4张图片

你可能感兴趣的:(C/C++)