最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++中的指針結構體數(shù)組以及指向結構體變量的指針

 更新時間:2015年09月15日 17:11:14   投稿:goldensun  
這篇文章主要介紹了C++中的指針結構體數(shù)組以及指向結構體變量的指針的用法,是C++入門學習中的基礎知識,需要的朋友可以參考下

C++結構體數(shù)組
一個結構體變量中可以存放一組數(shù)據(jù)(如一個學生的學號、姓名、成績等數(shù)據(jù))。如果有10個學生的數(shù)據(jù)需要參加運算,顯然應該用數(shù)組,這就是結構體數(shù)組。結構體數(shù)組與以前介紹過的數(shù)值型數(shù)組的不同之處在于:每個數(shù)組元素都是一個結構體類型的數(shù)據(jù),它們都分別包括各個成員項。

定義結構體數(shù)組和定義結構體變量的方法相仿,定義結構體數(shù)組時只需聲明其為數(shù)組即可。如:

struct Student //聲明結構體類型Student
{
  int num;
  char name[20];
  char sex;
  int age;
  float score;
  char addr[30];
};
Student stu[3]; //定義Student類型的數(shù)組stu

也可以直接定義一個結構體數(shù)組,如:

struct Student
{
  int num;
  char name[20];
  char sex;
  int age;
  float score;
  char addr[30];
}stu[3];


struct
{
  int num;
  char name[20];
  char sex;
  int age;
  float score;
  char addr[30];
}stu[3];

結構體數(shù)組的初始化與其他類型的數(shù)組一樣,對結構體數(shù)組可以初始化。如:

struct Student
{
  int num;
  char name[20];
  char sex;
  int age;
  float score;
  char addr[30];
}stu[3]={
  {10101,″Li Lin″,  ′M′, 18,87.5, ″103 Beijing Road″},
  {10102,″Zhang Fun″,′M′,19,99,  ″130 Shanghai Road″},
  {10104,″Wang Min″,′F′,  20,78.5, ″1010 Zhongshan Road″}
};

定義數(shù)組stu時,也可以不指定元素個數(shù),即寫成以下形式:

  stu[ ]={{…},{…},{…}};


編譯時,系統(tǒng)會根據(jù)給出初值的結構體常量的個數(shù)來確定數(shù)組元素的個數(shù)。一個結構體常量應包括結構體中全部成員的值。

當然,數(shù)組的初始化也可以用以下形式:

  Student stu[ ]={{…},{…},{…}}; //已事先聲明了結構體類型Student


由上可以看到,結構體數(shù)組初始化的一般形式是在所定義的數(shù)組名的后面加上 ={初值表列};
結構體數(shù)組應用舉例

下面舉一個簡單的例子來說明結構體數(shù)組的定義和引用。

【例】對候選人得票的統(tǒng)計程序。設有3個候選人,最終只能有1人當選為領導。今有10個人參加投票,從鍵盤先后輸入這10個人所投的候選人的名字,要求最后輸出這3個候選人的得票結果。

可以定義一個候選人結構體數(shù)組,包括3個元素,在每個元素中存放有關的數(shù)據(jù)。程序如下:

#include <iostream>
using namespace std;
struct Person //聲明結構體類型Person
{
  char name[20];
  int count;
};
int main( )
{
  //定義Person類型的數(shù)組,內容為3個候選人的姓名和當前的得票數(shù)
  Person leader[3]={"Li",0,"Zhang",0,"Fun",0};
  int i,j;
  char leader_name[20]; //leader_name為投票人所選的人的姓名
  for(i=0;i<10;i++)
  {
   cin>>leader_name; //先后輸入10張票上所寫的姓名
   for(j=0;j<3;j++) //將票上姓名與3個候選人的姓名比較
     //如果與某一候選人的姓名相同,就給他加一票
     if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;
  }
  cout<<endl;
  for(i=0;i<3;i++) //輸出3個候選人的姓名與最后得票數(shù)
  {
   cout<<leader[i].name<<":"<<leader[i].count<<endl;
  }
  return 0;
}

運行情況如下:

Zhang↙ (每次輸入一個候選人的姓名)
Li↙
Fun↙
Li↙
Zhang↙
Li↙
Zhang↙
Li↙
Fun↙
Wang↙
Li:4 (輸出3個候選人的姓名與最后得票數(shù))
Zhang:3
Fun:2

程序定義一個全局的結構體數(shù)組leader,它有3個元素,每一元素包含兩個成員,即name(姓名)和count(得票數(shù))。在定義數(shù)組時使之初始化,使3位候選人的票數(shù)都先置零。

在這個例子中,也可以不用字符數(shù)組而用string方法的字符串變量來存放姓名數(shù)據(jù),程序可修改如下:

#include <iostream>
#include <string>
using namespace std;
struct Person
{
string name;//成員name為字符串變量
int count;
};
int main( )
{
Person leader[3]={"Li",0,"Zhang",0,"Fun",0};
int i,j;
string leader_name;// leader_name為字符串變量
for(i=0;i<10;i++)
{
cin>>leader_name;
for(j=0;j<3;j++)
if(leader_name==leader[j].name) leader[j].count++//用“==”進行比較
}
cout<<endl;
for(i=0;i<3;i++)
{
cout<<leader[i].name<<":"<<leader[i].count<<endl;
}
return 0;
}

運行情況與前相同。顯然后一個程序節(jié)省內存空間,使用更方便,易讀性更好。但是 有些C++系統(tǒng)不能對包含string成員的結構體變量初始化,需要作一些修改才能運行, 讀者可上機試一下。

C++指向結構體變量的指針
一個結構體變量的指針就是該變量所占據(jù)的內存段的起始地址??梢栽O一個指針變量,用來指向一個結構體變量,此時該指針變量的值是結構體變量的起始地址。指針變量也可以用來指向結構體數(shù)組中的元素。
通過指向結構體變量的指針引用結構體變量中的成員

下面通過一個簡單例子來說明指向結構體變量的指針變量的應用。

【例】指向結構體變量的指針的應用。

#include <iostream>
#include <string>
using namespace std;
int main( )
{
  struct Student//聲明結構體類型student
  {
   int num;
   string name;
   char sex;
   float score;
  };
  Student stu;//定義Student類型的變量stu
  Student *p=&stu;//定義p為指向Student類型數(shù)據(jù)的指針變量并指向stu
  stu.num=10301;//對stu中的成員賦值
  stu.name="Wang Fun";//對string變量可以直接賦值
  stu.sex='f';
  stu.score=89.5;
  cout<<stu. num<<" "<<stu.name<<" "<<stu.sex<<" "<<
  stu.score<<endl;
  cout<<p -> num<<" "<<(*p).name<<" "<<(*p).sex<<" "<<(*p).score<<endl;
  return 0;
}

程序運行結果如下:
10301 Wang Fun f 89.5 (通過結構體變量名引用成員)
10301 Wang Fun f 89.5 (通過指針引用結構體變量中的成員)
兩個cout語句輸出的結果是相同的。

為了使用方便和使之直觀,C++提供了指向結構體變量的運算符->,例如p->num表示指針p當前指向的結構體變量中的成員num。
    p->num 和(*p).num等價。
同樣
    p->name等價于(*p).name。
也就是說,以下3種形式等價:
結構體變量.成員名。如stu.num。
(*p).成員名。如(*p).num。
p->成員名。如p->num。

“->”稱為指向運算符。

請分析以下幾種運算:

  • p->n 得到p指向的結構體變量中的成員n的值。
  • p->n++ 得到p指向的結構體變量中的成員n的值,用完該值后使它加1。
  • ++p->n 得到p指向的結構體變量中的成員n的值,并使之加1,然后再使用它。

用結構體變量和指向結構體變量的指針構成鏈表

鏈表是一種常見的重要的數(shù)據(jù)結構。下圖表示最簡單的一種鏈表(單向鏈表)的結構。

鏈表有一個“頭指針”變量,圖中以head表示,它存放一個地址。該地址指向一個元素。鏈表中的每一個元素稱為“結點”,每個結點都應包括兩個部分:
一是用戶需要用的實際數(shù)據(jù),
二是下一個結點的地址。

可以看到鏈表中各元素在內存中的存儲單元可以是不連續(xù)的。要找某一元素,可以先找到上一個元素,根據(jù)它提供的下一元素地址找到下一個元素。

可以看到,這種鏈表的數(shù)據(jù)結構,必須利用結構體變量和指針才能實現(xiàn)。

可以聲明一個結構體類型,包含兩種成員,一種是用戶需要用的實際數(shù)據(jù),另一種是用來存放下一結點地址的指針變量。

例如,可以設計這樣一個結構體類型:

struct Student
{
  int num;
  float score;
  Student *next; //next指向Student結構體變量
};


其中成員num和score是用戶需要用到的數(shù)據(jù),相當于圖7.8結點中的A, B, C, D。next是指針類型的成員,它指向Student類型數(shù)據(jù)(就是next所在的結構體類型)。用這種方法就可以建立鏈表。見圖。

圖中每一個結點都屬于Student類型,在它的成員next中存放下一個結點的地址,程序設計者不必知道各結點的具體地址,只要保證能將下一個結點的地址放到前一結點的成員next中即可。

下面通過一個例子來說明如何建立和輸出一個簡單鏈表。

【例】建立一個如圖所示的簡單鏈表,它由3個學生數(shù)據(jù)的結點組成。輸出各結點中的數(shù)據(jù)。

#define NULL 0
#include <iostream>
using namespace std;
struct Student
{
  long num;
  float score;
  struct Student *next;
};
int main( )
{
  Student a,b,c,*head,*p;
  a. num=31001;
  a.score=89.5; //對結點a的num和score成員賦值
  b. num=31003;
  b.score=90; //對結點b的num和score成員賦值
  c. num=31007;
  c.score=85; //對結點c的num和score成員賦值
  head=&a; //將結點a的起始地址賦給頭指針head
  a.next=&b; //將結點b的起始地址賦給a結點的next成員
  b.next=&c; //將結點c的起始地址賦給b結點的next成員
  c.next=NULL; //結點的next成員不存放其他結點地址
  p=head; //使p指針指向a結點
  do
  {
   cout<<p->num<<" "<<p->score<<endl; //輸出p指向的結點的數(shù)據(jù)
   p=p->next; //使p指向下一個結點
  } while (p!=NULL); //輸出完c結點后p的值為NULL
  return 0;
}

本例是比較簡單的,所有結點(結構體變量)都是在程序中定義的,不是臨時開辟的,也不能用完后釋放,這種鏈表稱為靜態(tài)鏈表。對各結點既可以通過上一個結點的next指針去訪問,也可以直接通過結構體變量名a, b, c去訪問。

動態(tài)鏈表則是指各結點是可以隨時插入和刪除的,這些結點并沒有變量名,只能先找到上一個結點,才能根據(jù)它提供的下一結點的地址找到下一個結點。只有提供第一個結點的地址,即頭指針head,才能訪問整個鏈表。如同一條鐵鏈一樣,一環(huán)扣一環(huán),中間是不能斷開的。

建立動態(tài)鏈表,要用到后面介紹的動態(tài)分配內存的運算符new和動態(tài)撤銷內存的運算符delete。

相關文章

  • C++獲得本機所有網(wǎng)卡的IP和MAC地址信息的實現(xiàn)方法

    C++獲得本機所有網(wǎng)卡的IP和MAC地址信息的實現(xiàn)方法

    下面小編就為大家?guī)硪黄狢++獲得本機所有網(wǎng)卡的IP和MAC地址信息的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 完美解決QT?QGraphicsView提升到QChartView報錯的問題

    完美解決QT?QGraphicsView提升到QChartView報錯的問題

    使用QT提供的QChartView來繪制圖表,提升QGraphicsView控件繼承QChartView后,然后將QGraphicsView提升到我們自己寫的類,怎么才能確保提升后編譯不報錯呢,下面小編給大家?guī)砹薗T QGraphicsView 提升到QChartView報錯解決方案,感興趣的朋友一起看看吧
    2023-05-05
  • C++實現(xiàn)通訊錄功能

    C++實現(xiàn)通訊錄功能

    這篇文章主要為大家詳細介紹了C++實現(xiàn)通訊錄功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言清楚了解指針的使用

    C語言清楚了解指針的使用

    C語言這門課程在計算機的基礎教學中一直占有比較重要的地位,然而要想突破C語言的學習,對指針的掌握是非常重要的,本文將具體針對指針的基礎做詳盡的介紹
    2022-06-06
  • C語言容易被忽視的函數(shù)設計原則基礎

    C語言容易被忽視的函數(shù)設計原則基礎

    C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環(huán)境支持便能運行的編程語言.那么C語言函數(shù)設計的一般原則和技巧都是怎樣的呢,下面帶你了解
    2022-04-04
  • Java C++ 題解leetcode857雇傭K名工人最低成本vector pair

    Java C++ 題解leetcode857雇傭K名工人最低成本vector pair

    這篇文章主要為大家介紹了Java C++ 題解leetcode857雇傭K名工人最低成本vector pair示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • C++中this指針用法示例詳解

    C++中this指針用法示例詳解

    在C++編程中this指針是每個非靜態(tài)成員函數(shù)的隱含參數(shù),指向調用對象的地址,它用于區(qū)分同一個類的不同實例,并訪問成員變量和成員函數(shù),這篇文章主要介紹了C++中this指針用法的相關資料,需要的朋友可以參考下
    2024-09-09
  • C++序列操作函數(shù)學習最全指南

    C++序列操作函數(shù)學習最全指南

    這篇文章主要給大家介紹了關于C++序列操作函數(shù)學習的相關資料,文中通過實例代碼介紹的非常詳細,對大家學習或者使用C++具有一定的參考學習價值,需要的朋友可以參考下
    2022-02-02
  • C語言中for循環(huán)問題(一個小坑需注意)

    C語言中for循環(huán)問題(一個小坑需注意)

    這篇文章主要給大家介紹了關于C語言中for循環(huán)問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 解析C++中構造函數(shù)的默認參數(shù)和構造函數(shù)的重載

    解析C++中構造函數(shù)的默認參數(shù)和構造函數(shù)的重載

    這篇文章主要介紹了解析C++中構造函數(shù)的默認參數(shù)和構造函數(shù)的重載,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09

最新評論

靖安县| 疏勒县| 吴川市| 米泉市| 高平市| 明水县| 湘西| 常州市| 吉水县| 望城县| 新泰市| 遵义县| 潼南县| 峡江县| 大连市| 商南县| 定安县| 建始县| 萝北县| 成安县| 普兰县| 大方县| 高密市| 集安市| 顺义区| 田阳县| 漠河县| 西和县| 仙居县| 西昌市| 乌拉特中旗| 中宁县| 宜丰县| 洛川县| 呼图壁县| 阿克苏市| 元谋县| 泰兴市| 南溪县| 天峻县| 沙洋县|