天天看點

結構體的初始化和引用 & 指向結構體變量的指針變量

一、首先我們來了解關于結構體以及結構體數組的概念。

自定義結構體:

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

運作結果:

結構體的初始化和引用 &amp; 指向結構體變量的指針變量

什麼是結構體數組?

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

運作結果:

結構體的初始化和引用 &amp; 指向結構體變量的指針變量

 二、指向結構體變量的指針變量

 先上代碼:

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

運作結果:

結構體的初始化和引用 &amp; 指向結構體變量的指針變量

那麼結構體數組呢?

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

運作結果:

結構體的初始化和引用 &amp; 指向結構體變量的指針變量