結構體變量、結構指針變量、結構數組作為函數的參數


結構體變量、結構指針變量、結構數組作為函數的參數應用實例分析 


struct stud
{
    long int num;
    float score;
};
/*結構體變量作為函數的參數,修改之后的成員值不能返回到主調函數*/

void funvr(struct stud t)
{
    t.num=2000101;
    t.score=71.0;
}

/*結構體數組作為函數的參數,修改后的元素的成員值能返回到主調函數*/

void funar(struct stud t[])
//void funar(struct stud &t)
{
    t[0].num=3000101;         /*注意結構體數組元素的成員的引用形式*/
    t[0].score=81.0;
    t[1].num=3000102;
    t[1].score=82.0;
}

/*結構體指針變量作為函數的參數,修改后的結構體成員的值能返回到主調函數*/

void funpr(struct stud *t)
{
    t->num=4000101;          /*注意通過結構體指針變量引用成員的具體形式*/
    (*t).score=92.0;
}


/*在主函數中分別調用上述函數修改成員值,再驗證結果的正確性*/

#include<stdio.h>
 
struct stud
{
    long int num;
    float score;
};
 
void funvr(struct stud t)
{
    t.num=2000101;
    t.score=71.0;
}
 
void funar(struct stud t[])
//void funar(struct stud &t)
{
    t[0].num=3000101;         /*注意結構體數組元素的成員的引用形式*/
    t[0].score=81.0;
    t[1].num=3000102;
    t[1].score=82.0;
}
 
void funpr(struct stud *t)
{
    t->num=4000101;          /*注意通過結構體指針變量引用成員的具體形式*/
    (*t).score=92.0;
}
 
void main()
{
    struct stud a[2]={
                        {1000101,61.0}, {1000102,62.0}
                     };
    struct stud    b=a[0],*p;
    
    printf("old b: b.num:%ld\tb.score:%f\n",b.num,b.score);
    /*顯示結構體變量b的成員的原有值*/
    funvr(b);
    /*驗證第一種情況,觀察並分析結果,看結構體變量作為函數參數時,形參結構體變量成員的值的改變能影響實參結構體變量的成員的值,
      以下為輸出調用函數funvr(b)之后的結果值*/
    printf("call funvr() new b: b.num:%ld\tb.score:%f\n ",b.num,b.score);
    funpr(&b);            /*將結構體變量的指針對作為函數的參數*/
    printf("call funpr() new b: b.num:%ld\tb.score:%f\n ",b.num,b.score);
                         /*輸出結構體數組a元素的原來的成員值*/
    printf("old a[0]:a[0].num:%ld\ta[0].score:%f\n ",a[0].num,a[0].score);
    printf("old a[1]:a[1].num:%ld\ta[1].score:%f\n ",a[1].num,a[1].score);
    /*將結構體數組a作為函數的參數,然后再輸出其元素的成員的值,已經被修改了*/
    funar(a);
    printf(" new a[0]:a[0].num:%ld\ta[0].score:%f\n ",a[0].num,a[0].score);
    printf("new a[1]:a[1].num:%ld\ta[1].score:%f\n ",a[1].num,a[1].score);
    
}
【結構體參數調用歸納】

1)結構體變量作為函數參數[實參與形參]時,形參結構體變量成員值的改變不影響對應的實參構體變量成員值的改變。

2)結構體數組或結構體指針變量作為函數參數[實參與形參]時,形參結構體數組元素[或形參結構體指針變量指向的變量]成員值的改變將影響對應的實參構體數組[或實參結構體指針變量指向的變量]成員值的改變。

3)結構體變量可作為函數的參數,函數可返回一結構體類數據

4)p=&b; 使結構體指針變量p指向結構體變量b的空間。

     p->num:表示通過指針變量引用結構體變量b的成員num

5)p=a;或p=&a[0];將結構體指針變量指向結構體數組a。則:

             ①p->num:表示通過指針變量引用結構體數組元素的成員num的值。

             ②p->num++:表示通過指針變量先引用結構體數組元素的成員num的值,再使該元素的成員num的值加 1,先引用其值然后其加1。

             ③++p->num:表示使指向的元素的成員num的值加1,再引用其值。

6)p=a;或p=&a[0];表示將結構體指針變量p指向結構體數組a。

             ①(p++)->num:表示通過指針變量先引用結構體數組元素  的成員num的值,再使指針變量本身加1,指針變量加1表示使指針變量指向結構體數組的下一個元素。

             ②(++p)->num:先使指針變量本身加1,先使使指針變量指向結構體數組的下一個元素,然后引用指針變量所指向的結構體數組元素的成員num的值。

結構體變量作為函數的形式參數實驗總結

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct str{
    int len;
    char s[0];
 
    str(int k)
    {
        len=k;
    }
 
}Str;
 
void make(Str tmp) // 注意當函數的形參是Str tmp 時,傳遞的方式是普通的結構體變量傳值調用,這里讓len的值改變不會影響下面的temp的len
{
    tmp.len=2;
}
 
void make_ptr(Str &tmp)  // 當函數的形參是Str &tmp,時傳遞的是結構體的地址,當這里使得tmp.len值改變時,實參temp.len值也會改變
{
    tmp.len=3;
}
 
void make_ptr2(Str *tmp) // 函數參數是一個Str類型的指針,傳地址調用就不用說了,(上面的引用方式是C++的特性之一,C語言不能那樣使用)
{
    tmp->len=4;
}
 
 
int main(int argc, char** argv) {
    
    struct str temp(1);
    printf("temp=%d\n",temp);
    
    make(temp);
    printf("temp=%d\n",temp);
    
    make_ptr(temp);
    printf("temp=%d\n",temp);
    
    return 0;
}
結構體變量作為函數參數傳遞的3種方法

將一個結構體變量中的數據傳遞給另一個函數,有下列3種方法:
用結構體變量名作參數。一般較少用這種方法。
用指向結構體變量的指針作實參,將結構體變量的地址傳給形參。
用結構體變量的引用變量作函數參數。

下面通過一個簡單的例子來說明,並對它們進行比較。
【例7.5】有一個結構體變量stu,內含學生學號、姓名和3門課的成績。要求在main函數中為各成員賦值,在另一函數print中將它們的值輸出。

1) 用結構體變量作函數參數。
 
#include <iostream>
#include <string>
using namespace std;
struct Student//聲明結構體類型Student
{
   int num;
   char name[20];
   float score[3];
};
int main( )
{
   void print(Student); //函數聲明,形參類型為結構體Student
   Student stu; //定義結構體變量
   stu.num=12345; //以下5行對結構體變量各成員賦值
   stu.name="Li Fung";
   stu.score[0]=67.5;
   stu.score[1]=89;
   stu.score[2]=78.5;
   print(stu); //調用print函數,輸出stu各成員的值
   return 0;
}
void print(Student st)
{
   cout<<st.num<<" "<<st.name<<" "<<st.score[0]
   <<" " <<st.score[1]<<" "<<st.score[2]<<endl;
}
運行結果為:
12345 Li Fung 67.5 89 78.5 (2)

2)用指向結構體變量的指針作實參在上面程序的基礎上稍作修改即可。
復制純文本新窗口
 
#include <iostream>
#include <string>
using namespace std;
struct Student
{
   int num; string name; //用string類型定義字符串變量
   float score[3];
}stu={12345,"Li Fung",67.5,89,78.5}; //定義結構體student變量stu並賦初值
int main( )
{
   void print(Student *); //函數聲明,形參為指向Student類型數據的指針變量
   Student *pt=&stu; //定義基類型為Student的指針變量pt,並指向stu
   print(pt); //實參為指向Student類數據的指針變量
   return 0;
}
//定義函數,形參p是基類型為Student的指針變量
void print(Student *p)
{
   cout<<p->num<<" "<<p->name<<" "<<p->score[0]<<" " <<
   p->score[1]<<" "<<p->score[2]<<endl;
}


調用print函數時,實參指針變量pt將stu的起始地址傳送給形參p(p也是基類型為student的指針變量)。這樣形參p也就指向stu,見圖7.10。
在print函數中輸出p所指向的結構體變量的各個成員值,它們也就是stu的成員值。在main函數中也可以不定義指針變量pt,而在調用print函數時以&stu作為實參,把stu的起始地址傳給實參p。


圖7.10

3) 用結構體變量的引用作函數參數
 
#include <iostream>
#include <string>
using namespace std;
struct Student
{
   int num;
   string name;
   float score[3];
}stu={12345,"Li Li",67.5,89,78.5};
int main( )
{
   void print(Student &);
   //函數聲明,形參為Student類型變量的引用
   print(stu);
   //實參為結構體Student變量
   return 0;
}
//函數定義,形參為結構體Student變量的引用
void print(Student &stud)
{
   cout<<stud.num<<" "<<stud.name<<" "<<stud.score[0]
   <<" " <<stud.score[1]<<" "<<stud.score[2]<<endl;
}
程序(1)用結構體變量作實參和形參,程序直觀易懂,效率是不高的。
程序(2)采用指針變量作為實參和形參,空間和時間的開銷都很小,效率較高。但程序(2)不如程序(1)那樣直接。
程序(3)的實參是結構體Student類型變量,而形參用Student類型的引用,虛實結合時傳遞的是stu的地址,因而效率較高。它兼有(1)和(2)的優點。

引用變量主要用作函數參數,它可以提高效率,而且保持程序良好的可讀性(引用'&'是C++的新特性)。在本例中用了string方法定義字符串變量,在某些C++系統中目前不能運行這些程序,讀者可以修改程序,使之能在自己所用的系統中運行。
————————————————
版權聲明:本文為CSDN博主「tham_」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/tham_/article/details/45370607

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM