結構體指針,C語言結構體指針詳解

結構體指針,可細分爲指向結構體變量的指針和指向結構體數組的指針。html

指向結構體變量的指針

前面咱們經過「結構體變量名.成員名」的方式引用結構體變量中的成員,除了這種方法以外還能夠使用指針。

前面講過,&student1 表示結構體變量 student1 的首地址,即 student1 第一個項的地址。若是定義一個指針變量 p 指向這個地址的話,p 就能夠指向結構體變量 student1 中的任意一個成員。

那麼,這個指針變量定義成什麼類型呢?只能定義成結構體類型,且指向什麼結構體類型的結構體變量,就要定義成什麼樣的結構體類型。好比指向 struct STUDENT 類型的結構體變量,那麼指針變量就必定要定義成 struct STUDENT* 類型。

下面將前面的程序用指針的方式修改一下:數組

# include <stdio.h>
# include <string.h>
struct AGE
{
    int year;
    int month;
    int day;
};
struct STUDENT
{
    char name[20];  //姓名
    int num;  //學號
    struct AGE birthday;  //生日
    float score;  //分數
};
int main(void)
{
    struct STUDENT student1; /*用struct STUDENT結構體類型定義結構體變量student1*/
    struct STUDENT *p = NULL;  /*定義一個指向struct STUDENT結構體類型的指針變量p*/
    p = &student1;  /*p指向結構體變量student1的首地址, 即第一個成員的地址*/
    strcpy((*p).name, "小明");  //(*p).name等價於student1.name
    (*p).birthday.year = 1989;
    (*p).birthday.month = 3;
    (*p).birthday.day = 29;
    (*p).num = 1207041;
    (*p).score = 100;
    printf("name : %s\n", (*p).name);  //(*p).name不能寫成p
    printf("birthday : %d-%d-%d\n", (*p).birthday.year, (*p).birthday.month, (*p).birthday.day);
    printf("num : %d\n", (*p).num);
    printf("score : %.1f\n", (*p).score);
    return 0;
}

輸出結果是:
name : 小明
birthday : 1989-3-29
num : 1207041
score : 100.0

咱們看到,用指針引用結構體變量成員的方式是:spa

(*指針變量名).成員名.net

注意,*p 兩邊的括號不可省略,由於成員運算符「.」的優先級高於指針運算符「*」,因此若是 *p 兩邊的括號省略的話,那麼 *p.num 就等價於 *(p.num) 了。

從該程序也能夠看出:由於指針變量 p 指向的是結構體變量 student1 第一個成員的地址,即字符數組 name 的首地址,因此 p 和 (*p).name 是等價的。

可是,「等價」僅僅是說它們表示的是同一個內存單元的地址,但它們的類型是不一樣的。指針變量 p 是 struct STUDENT* 型的,而 (*p).name 是 char* 型的。因此在 strcpy 中不能將 (*p).name 改爲 p。用 %s 進行輸入或輸出時,輸入參數或輸出參數也只能寫成 (*p).name 而不能寫成 p。

一樣,雖然 &student1 和 student1.name 表示的是同一個內存單元的地址,但它們的類型是不一樣的。&student1 是 struct STUDENT* 型的,而 student1.name 是 char* 型的,因此在對 p 進行初始化時,「p=&student1;」不能寫成「p=student1.name」。由於 p 是 struct STUDENT* 型的,因此不能將 char* 型的 student1.name 賦給 p。

此外爲了使用的方便和直觀,用指針引用結構體變量成員的方式:指針

(*指針變量名).成員名code

能夠直接用:htm

指針變量名->成員名blog

來代替,它們是等價的。「->」是「指向結構體成員運算符」,它的優先級同結構體成員運算符「.」同樣高。p->num 的含義是:指針變量 p 所指向的結構體變量中的 num 成員。p->num 最終表明的就是 num 這個成員中的內容。

下面再將程序用「->」修改一下:內存

# include <stdio.h>
# include <string.h>
struct AGE
{
    int year;
    int month;
    int day;
};
struct STUDENT
{
    char name[20];  //姓名
    int num;  //學號
    struct AGE birthday;  /*用struct AGE結構體類型定義結構體變量birthday, 生日*/
    float score;  //分數
};
int main(void)
{
    struct STUDENT student1; /*用struct STUDENT結構體類型定義結構體變量student1*/
    struct STUDENT *p = NULL;  /*定義struct STUDENT結構體類型的指針變量p*/
    p = &student1;  /*p指向結構體變量student1的首地址, 即第一項的地址*/
    strcpy(p->name, "小明");
    p->birthday.year = 1989;
    p->birthday.month = 3;
    p->birthday.day = 29;
    p->num = 1207041;
    p->score = 100;
    printf("name : %s\n", p->name);  //p->name不能寫成p
    printf("birthday : %d-%d-%d\n", p->birthday.year, p->birthday.month, p->birthday.day);
    printf("num : %d\n", p->num);
    printf("score : %.1f\n", p->score);
    return 0;
}
相關文章
相關標籤/搜索