1. 程式人生 > >結構體變數、結構指標變數、結構陣列作為函式的引數應用例項分析 .

結構體變數、結構指標變數、結構陣列作為函式的引數應用例項分析 .

結構體變數、結構指標變數、結構陣列作為函式的引數應用例項分析 

struct stud

{  long int num;  

float score;

};

/*結構體變數作為函式的引數,修改之後的成員值不能返回到主調函式*/

void funvr(struct stud t)

{  t.num=2000101;

t.score=71.0; 

}

/*結構體陣列作為函式的引數,修改後的元素的成員值能返回到主調函式*/

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;

}

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

main()

{  struct stud a[2]={{1000101,61.0}, {1000102,62.0}},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的值。

相關推薦

結構變數結構指標變數結構陣列作為函式引數應用例項分析 .

結構體變數、結構指標變數、結構陣列作為函式的引數應用例項分析  struct stud {  long int num;   float score; }; /*結構體變數作為函式的引數,修改之後的成員值不能返回到主調函式*/ void funvr(struct stud t) {  t.num=200010

結構陣列作為函式引數

把結構體陣列名作為函式的一個引數,然後在這個函式的函式裡面繼續作為引數,把一個值賦給這個結構體陣列的一個變數,我再賦值的地方是有值的,在函式裡面也是有值的,但是出了這個函式回到主函式時,這個結構體陣列的變數的值就為空了。為什麼呢?因為我在使用這個函式是這樣的, iRetur

C++基礎知識複習--結構陣列作為函式引數

//結構體陣列,類陣列,普通陣列,作為函式引數 #include<iostream> #include<string> using namespace std; class C

有關 陣列作為函式引數 & 區域性變數和全域性變數及其應用

一、陣列blabla 1.0陣列元素作函式實參。 (1).陣列元素可以用作函式實參,但不能是形參。(給陣列分配的儲存單元是連續的) 2.0一維陣列名作函式引數。 (1)陣列元素作實參時,向形參變數傳遞的時陣列元素的值。 陣列名作實參時,向形參傳遞的時陣列首元素的地址。

C語言經典例題--結構指標變數作為函式引數的傳遞

#include <stdio.h> #include <string.h> struct student { int age; char sex; char name[30]; }; void inputstudent(struct stu

結構變數結構指標變數作為函式引數傳遞的問題

/*2015年8月28日13:20:28通過函式完成對結構體變數的輸入和輸出*/# include <stdio.h># include <string.h>struct Student{int age;char sex;char name[100];

C++ 字串 14-- 18.40.結構函式 結構作為函式引數結構指標作為函式返回值

#include <iostream> #include <string> using namespace std; /*--------------------------------- 18.40.結構體與函式 結構體作為函式引數、結構體指標作為

結構(或者聯合體)變數的成員在記憶體裡是如何分佈的(轉)

1、概述 結構體變數的成員在記憶體裡是如何分佈的、成員先後順序始怎樣的、成員之間是連續的還是分散的、還是其他的什麼形式?這些問題既和軟體相關又和硬體相關。所謂軟體相關主要是指和具體的程式語言的編譯器的特性相關,編譯器為了優化CPU訪問記憶體的效率,在生成結構體成員的起始地址時遵循著某種特定的規則,這就是所謂

字元字串字元陣列字串指標變數

字元和字串的區別 字元 如下,定義char,每一個字元一般情況下佔用8個位元組。 char c, ch; 字串 例如"helloworld"; 注意' '和" "的區別,後者為常量字串 在C++中,有兩種型別的字串表示形式: C-風格字

結構實現連結串列的建立遍歷結點插入結點刪除連結串列刪除-----帶選單選項

#include <iostream> using namespace std; enum operation{create_List=1,print_List,insert_Node,delete_Node,delete_List,quit};//列舉型別,

結構變數作為函式引數

推薦使用引用的方式。因為傳遞的是變數的地址,因而效率較高,並且可讀性也高 #include <iostream> #include <string> using names

14OC 指標變數的強制型別轉換

int main(int argc, const char * argv[]) { @autoreleasepool { NSObject* obj = @"hello"; //強制型別轉化成NSString NSString* str = (NSStr

結構中包含二級指標案例

給出如下結構體,要求全部在堆區開闢空間。有多個老師,每個老師有多個學生。 typedef struct { char *name;//老師 int stu_num;//學生數 char **stu_arr;//學生名字 }TEACHER; 需要注意以下問題: 此問題使用雙層迴

結構中獲得this指標地址

 unsafe {  fixed (void* p = &this)  {   IntPtr Ptr = new IntPtr(p); } } 這是目前唯一獲得結構體或類的this指標地址的方法。需要編譯器開啟 /Unsafe選項。

結構中的二級指標及二級指標的初始化

int **temp;int i = 0;//初始化temp = new int*[100];for(i = 0; i < 100; i++)  temp[i] = new int[200];//釋放for(i = 0; i < 100; i++)  delete []temp[i];delete

結構作為函式引數(值傳遞,引用傳遞,指標傳遞)

一、值傳遞 #include <iostream> #include <string> using namespace std; struct Student {     int id;     string name;     float sco

C語言之結構巢狀一級指標和二級指標

指標是C語言的精華,也是c中最難的部分;為了鍛鍊和提高自己對指標的理解,特在結構體中巢狀一級指標和二級指標來加深對。 #include<stdio.h> #include <string.h> #include<stdlib.h&

結構指標作為函式引數傳遞卻無法傳值的有關問題

今天做C++作業遇到一個問題,需要寫一個函式(在連結串列中新增新的節點)將結構體指標作為形參,結果發現傳遞之後無法改變結構體的值,連結串列的長度還是沒變。通過查詢資料,發現把形參改為對結構體指標的應用即可解決問題。 原始碼: struct Tnode { strin

結構巢狀二級指標

#include <stdio.h> #include <stdlib.h> #include <

按值傳遞指標傳遞按引用傳遞的區別

值傳遞   形參是實參的拷貝(會在棧記憶體中建立形參並拷貝實參的值),函式執行完畢後會自動清除棧記憶體。所以從被呼叫函式的角度來說,值傳遞是單向的,形參不能改變實參。當內部函式不需要改變實參則採用值傳遞。 指標傳遞  指標傳遞引數的本質是值傳遞,只不過它傳遞的是一個地址值