青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

山寨:不是最好的,是最適合我們的!歡迎體驗山寨 中文版MSDN

Blog @ Blog

當華美的葉片落盡,生命的脈絡才歷歷可見。 -- 聶魯達

常用鏈接

統計

積分與排名

BBS

Blog

Web

最新評論

[轉]C/C++中的結構體

什么是結構體? 

  簡單的來說,結構體就是一個可以包含不同數據類型的一個結構,它是一種可以自己定義的數據類型,它的特點和數組主要有兩點不同,首先結構體可以在一個結構中聲明不同的數據類型,第二相同結構的結構體變量是可以相互賦值的,而數組是做不到的,因為數組是單一數據類型的數據集合,它本身不是數據類型(而結構體是),數組名稱是常量指針,所以不可以做為左值進行運算,所以數組之間就不能通過數組名稱相互復制了,即使數據類型和數組大小完全相同。 

  定義結構體使用struct修飾符,例如: 

程序代碼 程序代碼
struct test 

float a; 
int b; 
}
  上面的代碼就定義了一個名為test的結構體,它的數據類型就是test,它包含兩個成員a和b,成員a的數據類型為浮點型,成員b的數據類型為整型。 

  由于結構體本身就是自定義的數據類型,定義結構體變量的方法和定義普通變量的方法一樣。

程序代碼 程序代碼
test pn1; 

  這樣就定義了一test結構體數據類型的結構體變量pn1,結構體成員的訪問通過點操作符進行,pn1.a=10 就對結構體變量pn1的成員a進行了賦值操作。 

  注意:結構體生命的時候本身不占用任何內存空間,只有當你用你定義的結構體類型定義結構體變量的時候計算機才會分配內存。 

  結構體,同樣是可以定義指針的,那么結構體指針就叫做結構指針。 

  結構指針通過->符號來訪問成員,下面我們就以上所說的看一個完整的例子:

程序代碼 程序代碼
#include <iostream>    
#include 
<string>    
using namespace std;  
  
struct test//定義一個名為test的結構體  
{  
    
int a;//定義結構體成員a  
    int b;//定義結構體成員b  
}
;  
  
void main()      
{  
    test pn1;
//定義結構體變量pn1  
    test pn2;//定義結構體變量pn2  
  
    pn2.a
=10;//通過成員操作符.給結構體變量pn2中的成員a賦值  
    pn2.b=3;//通過成員操作符.給結構體變量pn2中的成員b賦值  
  
    pn1
=pn2;//把pn2中所有的成員值復制給具有相同結構的結構體變量pn1  
    cout<<pn1.a<<"|"<<pn1.b<<endl;  
    cout
<<pn2.a<<"|"<<pn2.b<<endl;  
  
    test 
*point;//定義結構指針  
  
    point
=&pn2;//指針指向結構體變量pn2的內存地址  
    cout<<pn2.a<<"|"<<pn2.b<<endl;  
    point
->a=99;//通過結構指針修改結構體變量pn2成員a的值  
    cout<<pn2.a<<"|"<<pn2.b<<endl;  
    cout
<<point->a<<"|"<<point->b<<endl;  
    cin.
get();  
}

 
  總之,結構體可以描述數組不能夠清晰描述的結構,它具有數組所不具備的一些功能特性。

  下面我們來看一下,結構體變量是如何作為函數參數進行傳遞的。

程序代碼 程序代碼
#include <iostream>    
#include 
<string>    
using namespace std;  
  
struct test  
{  
    
char name[10];  
    
float socre;  
}
;  
  
void print_score(test pn)//以結構變量進行傳遞  
{  
    cout
<<pn.name<<"|"<<pn.socre<<endl;  
}
  
  
void print_score(test *pn)//一結構指針作為形參  
{  
    cout
<<pn->name<<"|"<<pn->socre<<endl;  
}
  
  
void main()      
{  
    test a[
2]={{"marry",88.5},{"jarck",98.5}};  
    
int num = sizeof(a)/sizeof(test);  
    
for(int i=0;i<num;i++)  
    
{  
        print_score(a[i]);  
    }
  
    
//for(int i=0;i<num;i++)  //error C2374: 'i' : redefinition; multiple initialization
    for(int j=0;j<num;j++)
    
{  
        
//print_score(&a[i]); 
        print_score(&a[j]);
        
    }
  
    cin.
get();  
}

  void print_score(test *pn)的效率是要高過void print_score(test pn)的,因為直接內存操作避免了??臻g開辟結構變量空間需求,節省內存。

  下面我們再說一下,傳遞結構引用的例子。 

  利用引用傳遞的好處很多,它的效率和指針相差無幾,但引用的操作方式和值傳遞幾乎一樣,種種優勢都說明善用引用可以做到程序的易讀和易操作,它的優勢尤其在結構很大的時候,避免傳遞結構變量很大的值,節省內存,提高效率。

程序代碼 程序代碼
#include <iostream>    
#include 
<string>    
using namespace std;  
  
struct test  
{  
    
char name[10];  
    
float socre;  
}
;  
  
void print_score(test &pn)//以結構變量進行傳遞  
{  
    cout
<<pn.name<<"|"<<pn.socre<<endl;  
}
  
  
void main()      
{  
    test a[
2]={{"marry",88.5},{"jarck",98.5}};  
    
int num = sizeof(a)/sizeof(test);  
    
for(int i=0;i<num;i++)  
    
{  
        print_score(a[i]);  
    }
  
    cin.
get();  
}
 


  上面我們說明了易用引用對結構體進行操作的優勢,下面我們重點對比兩個例程,進一部分析關于效率的問題。

程序代碼 程序代碼
//-------------------------------------例程1---------------------------------  
  
#include 
<iostream>    
#include 
<string>    
using namespace std;  
  
struct test  
{  
    
char name[10];  
    
float socre;  
}
;  
  
void print_score(test &pn)  
{  
    cout
<<pn.name<<"|"<<pn.socre<<endl;  
}
  
  
test get_score()  
{  
    test pn;  
    cin
>>pn.name>>pn.socre;  
    
return pn;  
}
  
void main()  
{  
    test a[
2];  
    
int num = sizeof(a)/sizeof(test);  
    
for(int i=0;i<num;i++)  
    
{  
        a[i]
=get_score();  
    }
  
    cin.
get();  
    
for(int i=0;i<num;i++)  
    
{  
        print_score(a[i]);  
    }
  
    cin.
get();  
}
  
  
//-------------------------------------例程2---------------------------------  
  
#include 
<iostream>    
#include 
<string>    
using namespace std;  
  
struct test  
{  
    
char name[10];  
    
float socre;  
}
;  
  
void print_score(test &pn)  
{  
    cout
<<pn.name<<"|"<<pn.socre<<endl;  
}
  
  
void get_score(test &pn)  
{  
    cin
>>pn.name>>pn.socre;  
}
  
void main()  
{  
    test a[
2];  
    
int num = sizeof(a)/sizeof(test);  
    
for(int i=0;i<num;i++)  
    
{  
        get_score(a[i]);  
    }
  
    cin.
get();  
    
for(int i=0;i<num;i++)  
    
{  
        print_score(a[i]);  
    }
  
    cin.
get();  
}



  例程2的效率要遠高過例程1的原因主要有以下兩處: 


  第一: 

  例程1中的 

程序代碼 程序代碼
test get_score() 

test pn; 
cin
>>pn.name>>pn.socre; 
return pn; 
}

 
  調用的時候在內部要在??臻g開辟一個名為pn的結構體變量,程序pn的時候又再次在棧內存空間內自動生成了一個臨時結構體變量temp,在前面的教程中我們已經說過,它是一個copy,而例程2中的: 
程序代碼 程序代碼
void get_score(test &pn) 

cin
>>pn.name>>pn.socre; 
}
 

  卻沒有這一過程,不開辟任何新的內存空間,也沒有任何臨時變量的生成。 

  第二: 

  例程1在mian()中,必須對返回的結構體變量進行一次結構體變量與結構體變量直接的相互賦值操作。 
程序代碼 程序代碼
for(int i=0;i<num;i++

a[i]
=get_score(); 
}
 

  而例程2中由于是通過內存地址直接操作,所以完全沒有這一過程,提高了效率。
程序代碼 程序代碼
for(int i=0;i<num;i++

get_score(a[i]); 
}
 

  函數也是可以返回結構體應用的,例子如下:

程序代碼 程序代碼
#include <iostream>    
#include 
<string>    
using namespace std;  
  
struct test  
{  
    
char name[10];  
    
float socre;  
}
;  
  
test a;  
  
  
test 
&get_score(test &pn)  
{  
    cin
>>pn.name>>pn.socre;  
    
return pn;  
}
  
  
void print_score(test &pn)    
{    
    cout
<<pn.name<<"|"<<pn.socre<<endl;    
}
    
  
void main()  
{  
    test 
&sp=get_score(a);  
    cin.
get();  
    cout
<<sp.name<<"|"<<sp.socre;  
    cin.
get();   
}
 

  調用get_score(a);結束并返回的時候,函數內部沒有臨時變量的產生,返回直接吧全局結構變量a的內存地址賦予結構引用sp 

  最后提一下指針的引用 

  定義指針的引用方法如下:

程序代碼 程序代碼
void main()  
{  
int a=0;  
int b=10;  
int *p1=&a;  
int *p2=&b;  
int *&pn=p1;  
cout 
<<pn<<"|"<<*pn<<endl;  
pn
=p2;  
cout 
<<pn<<"|"<<*pn<<endl;  
cin.
get();  
}
  pn就是一個指向指針的引用,它也可以看做是指針別名,總之使用引用要特別注意它的特性,它的操作是和普通指針一樣的,在函數中對全局指針的引用操作要十分小心,避免破壞全局指針!

posted on 2007-08-13 23:11 isabc 閱讀(343) 評論(0)  編輯 收藏 引用 所屬分類: C++基礎

廣告信息(免費廣告聯系)

中文版MSDN:
歡迎體驗

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品久久影院| 蜜桃av久久久亚洲精品| 国产区亚洲区欧美区| 亚洲永久免费av| 欧美在线观看视频一区二区| 国产免费成人| 欧美精品亚洲一区二区在线播放| 一区二区不卡在线视频 午夜欧美不卡在| 国产精品国产自产拍高清av| 久久久国产精品一区| 日韩亚洲欧美在线观看| 久久久www| 亚洲一区二区高清| 在线观看一区二区视频| 国产精品成人免费精品自在线观看| 欧美日韩综合不卡| 欧美11—12娇小xxxx| 久久国产精品一区二区| 亚洲精品久久久久中文字幕欢迎你| 欧美国产欧美亚州国产日韩mv天天看完整 | 亚洲午夜性刺激影院| 欧美一级大片在线免费观看| 99精品视频免费观看| 在线日韩精品视频| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲综合精品| 99这里只有久久精品视频| 欧美高清视频一二三区| 久久久综合网站| 欧美一区二区三区成人| 欧美成人免费全部观看天天性色| 日韩视频免费在线观看| 欧美亚洲免费| 欧美一区二区三区婷婷月色 | 亚洲欧美日本另类| 亚洲影院在线观看| 午夜久久久久| 欧美永久精品| 国产一区二区电影在线观看 | 性久久久久久| 亚洲免费视频网站| 欧美激情第4页| 国产午夜精品久久久久久免费视| 国产精品区二区三区日本| 国产精品www.| 国产精品亚洲а∨天堂免在线| 亚洲国内欧美| 日韩一级二级三级| 久久婷婷国产综合国色天香| 鲁大师影院一区二区三区| 久久久久免费观看| 亚洲在线播放| 国产精品久久久久久久久果冻传媒| 亚洲精品激情| 亚洲专区一区二区三区| 91久久精品国产91久久| 艳女tv在线观看国产一区| 麻豆成人在线播放| 亚洲第一黄色网| 蜜臀av国产精品久久久久| 亚洲黄色大片| 亚洲一区黄色| 国产精品日日摸夜夜摸av| 亚洲欧美一区二区三区极速播放 | 日韩视频专区| 欧美视频在线看| 亚洲欧美日韩中文视频| 亚洲一区综合| 国产亚洲在线| 久久中文精品| 美女国产一区| 亚洲精品视频免费在线观看| 亚洲激情视频网站| 欧美日韩中文字幕在线| 亚洲在线不卡| 久久成人一区| 亚洲精选中文字幕| 久久久999国产| 久久人人爽人人| 国产精品久久久久91| 亚洲欧美一区二区原创| 久久国产精品72免费观看| 亚洲盗摄视频| 99国产精品久久| 国产亚洲精品久久久久动| 噜噜噜久久亚洲精品国产品小说| 欧美波霸影院| 国产伊人精品| 欧美一二三区精品| 久久大香伊蕉在人线观看热2| 亚洲国产第一页| 久久久人成影片一区二区三区 | 亚洲综合色噜噜狠狠| 性xx色xx综合久久久xx| 亚洲激情在线观看| 一区二区成人精品| 1024成人网色www| 一区二区三区产品免费精品久久75| 国产欧美日韩激情| 亚洲经典在线看| 国产一区久久| 一区二区av| 亚洲精品日韩综合观看成人91| 亚洲欧美成人| 亚洲少妇中出一区| 亚洲精品在线观| 欧美成人综合一区| 欧美诱惑福利视频| 欧美另类99xxxxx| 一本色道久久综合狠狠躁的推荐| 午夜视频在线观看一区二区三区| 亚洲精品网址在线观看| 欧美一区二区三区免费在线看| 一本色道久久综合狠狠躁篇怎么玩| 久久精品一区| 欧美在线视频全部完| 欧美一区二区精品在线| 一本色道久久综合亚洲精品小说 | 国产日韩欧美在线| 夜夜嗨av一区二区三区四季av| 亚洲国产精品久久91精品| 性亚洲最疯狂xxxx高清| 亚洲欧美日韩一区二区三区在线观看 | 国产精品二区三区四区| 亚洲欧洲在线视频| 亚洲第一中文字幕在线观看| 欧美影院午夜播放| 亚洲电影有码| 欧美一区二区三区四区在线观看| 午夜亚洲精品| 国产精品久久夜| 一区二区三区av| 在线综合亚洲欧美在线视频| 亚洲先锋成人| 亚洲第一福利社区| 久久男人av资源网站| 久久精品男女| 欧美精选午夜久久久乱码6080| 欧美福利影院| 亚洲国产一区二区三区在线播 | 99re66热这里只有精品3直播| 免费观看成人网| 午夜精品www| 欧美日本国产| 亚洲激情成人在线| 亚洲午夜精品| 国产精品视频999| 午夜精品久久久久久久男人的天堂| 羞羞视频在线观看欧美| 国产日韩专区在线| 久久精品91久久久久久再现| 久久综合久久综合久久综合| 激情久久五月| 亚洲图片在线观看| 欧美亚洲午夜视频在线观看| 国产欧美日韩高清| 久久综合999| 欧美专区中文字幕| 国产在线精品一区二区夜色| 久久久久久伊人| 欧美一区二区三区久久精品茉莉花 | 欧美精品v日韩精品v国产精品| 亚洲三级电影在线观看| 亚洲尤物视频在线| 韩日精品在线| 亚洲一区二区三区四区五区午夜 | 一本色道久久88亚洲综合88 | 亚洲一区二区av电影| 国产字幕视频一区二区| 欧美成人免费观看| 亚洲午夜一区二区三区| 免费成人黄色av| 亚洲天堂av电影| 影视先锋久久| 欧美亚洲免费在线| 亚洲国产日韩欧美在线动漫| 亚洲欧美国产精品桃花| 亚洲二区免费| 国产精品无码专区在线观看| 快射av在线播放一区| 亚洲自拍偷拍视频| 亚洲区第一页| 欧美 日韩 国产精品免费观看| 一区在线免费| 欧美午夜片在线观看| 久久人人爽人人爽| 午夜精品久久久久久久男人的天堂| 欧美激情亚洲| 亚洲最新在线视频| 一区三区视频| 国产视频精品免费播放| 欧美日韩一区二区三区免费| 一二三区精品福利视频| 美女国产一区| 久久久久久久综合狠狠综合| 亚洲一区二区在线免费观看视频 | 欧美电影在线观看完整版| 久久激情中文| 性色av一区二区三区| 亚洲图片在线|