欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言結(jié)構(gòu)體指針引用詳解

 更新時(shí)間:2021年12月11日 09:33:05   投稿:newname  
C語言中結(jié)構(gòu)體指針,可細(xì)分為指向結(jié)構(gòu)體變量的指針和指向結(jié)構(gòu)體數(shù)組的指針。本文將詳細(xì)為大家介紹一下這兩種結(jié)構(gòu)體指針如何引用,需要的小伙伴可以參考一下

結(jié)構(gòu)體指針,可細(xì)分為指向結(jié)構(gòu)體變量的指針和指向結(jié)構(gòu)體數(shù)組的指針。

指向結(jié)構(gòu)體變量的指針

前面我們通過“結(jié)構(gòu)體變量名.成員名”的方式引用結(jié)構(gòu)體變量中的成員,除了這種方法之外還可以使用指針。

前面講過,&student1 表示結(jié)構(gòu)體變量 student1 的首地址,即 student1 第一個(gè)項(xiàng)的地址。如果定義一個(gè)指針變量 p 指向這個(gè)地址的話,p 就可以指向結(jié)構(gòu)體變量 student1 中的任意一個(gè)成員。

那么,這個(gè)指針變量定義成什么類型呢?只能定義成結(jié)構(gòu)體類型,且指向什么結(jié)構(gòu)體類型的結(jié)構(gòu)體變量,就要定義成什么樣的結(jié)構(gòu)體類型。比如指向 struct STUDENT 類型的結(jié)構(gòu)體變量,那么指針變量就一定要定義成 struct STUDENT* 類型。

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

# include <stdio.h>
# include <string.h>
struct AGE
{
    int year;
    int month;
    int day;
};
struct STUDENT
{
    char name[20];  //姓名
    int num;  //學(xué)號(hào)
    struct AGE birthday;  //生日
    float score;  //分?jǐn)?shù)
};
int main(void)
{
    struct STUDENT student1; /*用struct STUDENT結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量student1*/
    struct STUDENT *p = NULL;  /*定義一個(gè)指向struct STUDENT結(jié)構(gòu)體類型的指針變量p*/
    p = &student1;  /*p指向結(jié)構(gòu)體變量student1的首地址, 即第一個(gè)成員的地址*/
    strcpy((*p).name, "小明");  //(*p).name等價(jià)于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;
}

輸出結(jié)果是:

name : 小明

birthday : 1989-3-29

num : 1207041

score : 100.0

我們看到,用指針引用結(jié)構(gòu)體變量成員的方式是:

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

注意,*p 兩邊的括號(hào)不可省略,因?yàn)槌蓡T運(yùn)算符“.”的優(yōu)先級(jí)高于指針運(yùn)算符“*”,所以如果 *p 兩邊的括號(hào)省略的話,那么 *p.num 就等價(jià)于 *(p.num) 了。

從該程序也可以看出:因?yàn)橹羔樧兞?p 指向的是結(jié)構(gòu)體變量 student1 第一個(gè)成員的地址,即字符數(shù)組 name 的首地址,所以 p 和 (*p).name 是等價(jià)的。

但是,“等價(jià)”僅僅是說它們表示的是同一個(gè)內(nèi)存單元的地址,但它們的類型是不同的。指針變量 p 是 struct STUDENT* 型的,而 (*p).name 是 char* 型的。所以在 strcpy 中不能將 (*p).name 改成 p。用 %s 進(jìn)行輸入或輸出時(shí),輸入?yún)?shù)或輸出參數(shù)也只能寫成 (*p).name 而不能寫成 p。

同樣,雖然 &student1 和 student1.name 表示的是同一個(gè)內(nèi)存單元的地址,但它們的類型是不同的。&student1 是 struct STUDENT* 型的,而 student1.name 是 char* 型的,所以在對(duì) p 進(jìn)行初始化時(shí),“p=&student1;”不能寫成“p=student1.name”。因?yàn)?p 是 struct STUDENT* 型的,所以不能將 char* 型的 student1.name 賦給 p。

此外為了使用的方便和直觀,用指針引用結(jié)構(gòu)體變量成員的方式:

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

可以直接用:

指針變量名->成員名

來代替,它們是等價(jià)的?!?>”是“指向結(jié)構(gòu)體成員運(yùn)算符”,它的優(yōu)先級(jí)同結(jié)構(gòu)體成員運(yùn)算符“.”一樣高。p->num 的含義是:指針變量 p 所指向的結(jié)構(gòu)體變量中的 num 成員。p->num 最終代表的就是 num 這個(gè)成員中的內(nèi)容。

下面再將程序用“->”修改一下:

# include <stdio.h>
# include <string.h>
struct AGE
{
    int year;
    int month;
    int day;
};
struct STUDENT
{
    char name[20];  //姓名
    int num;  //學(xué)號(hào)
    struct AGE birthday;  /*用struct AGE結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量birthday, 生日*/
    float score;  //分?jǐn)?shù)
};
int main(void)
{
    struct STUDENT student1; /*用struct STUDENT結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量student1*/
    struct STUDENT *p = NULL;  /*定義struct STUDENT結(jié)構(gòu)體類型的指針變量p*/
    p = &student1;  /*p指向結(jié)構(gòu)體變量student1的首地址, 即第一項(xiàng)的地址*/
    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;
}

輸出結(jié)果是:

name : 小明

birthday : 1989-3-29

num : 1207041

score : 100.0

但是要注意的是,只有“指針變量名”后面才能加“->”,千萬不要在成員名如 birthday 后面加“->”。

綜上所述,以下 3 種形式是等價(jià)的:

  • 結(jié)構(gòu)體變量.成員名。
  • (*指針變量).成員名。
  • 指針變量->成員名。

其中第 3 種方式很重要,通常都是使用這種方式,另外兩種方式用得不多。后面講鏈表的時(shí)候用的也都是第 3 種方式。

指向結(jié)構(gòu)體數(shù)組的指針

在前面講數(shù)值型數(shù)組的時(shí)候可以將數(shù)組名賦給一個(gè)指針變量,從而使該指針變量指向數(shù)組的首地址,然后用指針訪問數(shù)組的元素。結(jié)構(gòu)體數(shù)組也是數(shù)組,所以同樣可以這么做。

我們知道,結(jié)構(gòu)體數(shù)組的每一個(gè)元素都是一個(gè)結(jié)構(gòu)體變量。如果定義一個(gè)結(jié)構(gòu)體指針變量并把結(jié)構(gòu)體數(shù)組的數(shù)組名賦給這個(gè)指針變量的話,就意味著將結(jié)構(gòu)體數(shù)組的第一個(gè)元素,即第一個(gè)結(jié)構(gòu)體變量的地址,也即第一個(gè)結(jié)構(gòu)變量中的第一個(gè)成員的地址賦給了這個(gè)指針變量。比如:

# include <stdio.h>
struct STU
{
    char name[20];
    int age;
    char sex;
    char num[20];
};
int main(void)
{
    struct STU stu[5] = {{"小紅", 22, 'F', "Z1207031"}, {"小明", 21, 'M', "Z1207035"}, {"小七", 23, 'F', "Z1207022"}};
    struct STU *p = stu;
    return 0;
}

此時(shí)指針變量 p 就指向了結(jié)構(gòu)體數(shù)組的第一個(gè)元素,即指向 stu[0]。我們知道,當(dāng)一個(gè)指針指向一個(gè)數(shù)組后,指針就可以通過移動(dòng)的方式指向數(shù)組的其他元素。

這個(gè)原則對(duì)結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針同樣適用,所以 p+1 就指向 stu[1] 的首地址;p+2 就指向 stu[2] 的首地址……所以只要利用 for 循環(huán),指針就能一個(gè)個(gè)地指向結(jié)構(gòu)體數(shù)組元素。

同樣需要注意的是,要將一個(gè)結(jié)構(gòu)體數(shù)組名賦給一個(gè)結(jié)構(gòu)體指針變量,那么它們的結(jié)構(gòu)體類型必須相同。

下面編寫一個(gè)程序:

# include <stdio.h>
struct STU
{
    char name[20];
    int age;
    char sex;
    char num[20];
};
int main(void)
{
    struct STU stu[3] = {{"小紅", 22, 'F', "Z1207031"}, {"小明", 21, 'M', "Z1207035"}, {"小七", 23, 'F', "Z1207022"}};
    struct STU *p = stu;
    for (; p<stu+3; ++p)
    {
        printf("name:%s; age:%d; sex:%c; num:%s\n", p->name, p->age, p->sex, p->num);
    }
    return 0;
}

輸出結(jié)果是:

name:小紅; age:22; sex:F; num:Z1207031

name:小明; age:21; sex:M; num:Z1207035

name:小七; age:23; sex:F; num:Z1207022

此外同前面“普通數(shù)組和指針的關(guān)系”一樣,當(dāng)指針變量 p 指向 stu[0] 時(shí),p[0] 就等價(jià)于 stu[0];p[1] 就等價(jià)于 stu[1];p[2] 就等價(jià)于 stu[2]……所以 stu[0].num 就可以寫成 p[0].num,其他同理。下面將上面的程序用 p[i] 的方式修改一下:

# include <stdio.h>
struct STU
{
    char name[20];
    int age;
    char sex;
    char num[20];
};
int main(void)
{
    struct STU stu[3] = {{"小紅", 22, 'F', "Z1207031"}, {"小明", 21, 'M', "Z1207035"}, {"小七", 23, 'F', "Z1207022"}};
    struct STU *p = stu;
    int i = 0;
    for (; i<3; ++i)
    {
        printf("name:%s; age:%d; sex:%c; num:%s\n", p[i].name, p[i].age, p[i].sex, p[i].num);
    }
    return 0;
}

輸出結(jié)果是:

name:小紅; age:22; sex:F; num:Z1207031

name:小明; age:21; sex:M; num:Z1207035

name:小七; age:23; sex:F; num:Z1207022?

到此這篇關(guān)于C語言結(jié)構(gòu)體指針引用詳解的文章就介紹到這了,更多相關(guān)C語言 結(jié)構(gòu)體指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實(shí)現(xiàn)商品管理系統(tǒng)開發(fā)

    C語言實(shí)現(xiàn)商品管理系統(tǒng)開發(fā)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)商品管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • qt獲取當(dāng)前時(shí)間(QDateTime、QTime、QDate)

    qt獲取當(dāng)前時(shí)間(QDateTime、QTime、QDate)

    本文主要介紹了qt獲取當(dāng)前時(shí)間(QDateTime、QTime、QDate),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C語言實(shí)現(xiàn)順序表的基本操作指南(注釋很詳細(xì))

    C語言實(shí)現(xiàn)順序表的基本操作指南(注釋很詳細(xì))

    線性表是最簡單的數(shù)據(jù)結(jié)構(gòu),而順序表又是最簡單的線性表,其基本思想是用一段地址連續(xù)的儲(chǔ)存單元依次存儲(chǔ)線性表的數(shù)據(jù)元素,下面這篇文章主要給大家介紹了關(guān)于C語言實(shí)現(xiàn)順序表的基本操作,需要的朋友可以參考下
    2021-10-10
  • C語言之?dāng)?shù)組名與數(shù)組起始地址的關(guān)系解析

    C語言之?dāng)?shù)組名與數(shù)組起始地址的關(guān)系解析

    這篇文章主要介紹了C語言之?dāng)?shù)組名與數(shù)組起始地址的關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語言實(shí)現(xiàn)素因子分解

    C語言實(shí)現(xiàn)素因子分解

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)素因子分解,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C語言實(shí)現(xiàn)數(shù)組移位、前移、后移與整體移動(dòng)實(shí)例代碼

    C語言實(shí)現(xiàn)數(shù)組移位、前移、后移與整體移動(dòng)實(shí)例代碼

    C語言中通??梢允褂醚h(huán)語句實(shí)現(xiàn)數(shù)組的移動(dòng),下面這篇文章主要給大家介紹了關(guān)于C語言實(shí)現(xiàn)數(shù)組移位、前移、后移與整體移動(dòng)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • C語言中的柔性數(shù)組你了解嗎

    C語言中的柔性數(shù)組你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C99中的新語法——柔性數(shù)組的使用以及優(yōu)缺點(diǎn),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-04-04
  • C語言中計(jì)算字符串長度與分割字符串的方法

    C語言中計(jì)算字符串長度與分割字符串的方法

    這篇文章主要介紹了C語言中計(jì)算字符串長度與分割字符串的方法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • 分析C語言一個(gè)簡單程序

    分析C語言一個(gè)簡單程序

    本文主要介紹C語言簡單的程序,這里給大家詳細(xì)介紹C語言代碼,對(duì)函數(shù)概念、頭文件、自定義函數(shù)等基礎(chǔ)信息的講解,希望能幫助剛剛學(xué)習(xí)的同學(xué)
    2016-07-07
  • c++動(dòng)態(tài)內(nèi)存管理與智能指針的相關(guān)知識(shí)點(diǎn)

    c++動(dòng)態(tài)內(nèi)存管理與智能指針的相關(guān)知識(shí)點(diǎn)

    為了更容易同時(shí)也更安全地使用動(dòng)態(tài)內(nèi)存,新的標(biāo)準(zhǔn)庫提供了兩種智能指針(smart pointer)類型來管理對(duì)象,下面這篇文章主要給大家介紹了關(guān)于c++動(dòng)態(tài)內(nèi)存管理與智能指針的相關(guān)知識(shí)點(diǎn),需要的朋友可以參考下
    2022-03-03

最新評(píng)論