第六節 指向結構體型別資料的指標
三、用指向結構體的指標作函式引數有時想將乙個結構體變數的值傳給另乙個函式,但原來的c標準不允許用結構體變數作為函式引數。那麼用什麼方法來解決這個問題呢?有兩個方法:
①用結構體變數的成員作引數。例如,用stu[2].name作函式實參,將實參值傳給形參。用法和用普通變數作實參是一樣的,屬「值傳遞」方式。
②用指向結構體變數(或陣列)的指標作實參,將結構體變數(或陣列)的位址傳給開參。
[例8.5] 有乙個結構體變數stu.內含學生學號、姓名和三門課的成績。要求在main函式中賦以值,在另一函式print中將它們列印輸出。
#include "string.h"
#define format"%d/n%s/n%f/n%f/n"
struct student
; main()
void print(p)
struct student *p;
執行結果為:
12345
li li
67.500000
89.000000
78.599998
struct student 被定義為外部型別,這樣,同一原始檔中的各個函式都可以用它來定義變數的型別。main函式中的stu變數定義為struct student 型別,print函式中的形參這被定義為指向struct student型別資料的指標變數。在main函式中對stu的各成員賦值。注意在呼叫函時,用&stu作實參,&stu是結構體變數stu的位址。在呼叫函式時將該位址傳送給形參p(p是指標變數)。這樣p就指向stu。在print函式中輸出p所指向的結構體變數的各個成員值,它們也就是stu的成員值。
main函式中的對各成員賦值也可以改用scanf函式輸入。即用scanf("%d %s %f %f %f",&stu.num,stu.name,&stu.score[1],&stu.score[2]);
輸入時用下面形式輸入:
12345 lili 67.5 89 78.6
注意: 輸入項表列中stu.name前沒有「&"符號,因為stu.name是字元陣列名本身代表位址,不應寫成&stu.name。
ansi c允許用整個結構體作為函式的引數傳遞,但是必須保證實參與形參的型別相同。例10.5中main函式中最後一行呼叫print函式,也可改用print(stu); 即實參改用結構體變數(而不是指標)。同時print函式也應相應改為:
void print(stud)
struct student stud;
把乙個完整的結構體變數作為引數傳遞,雖然合法,但要將全部成員值乙個乙個傳遞,費時間又費空間,開銷大。如果結構體型別中的成員很多,或有一些成員是陣列,則程式執行效率會大大降低。在這種情況下,用指標作函式引數比較好,能提高執行效率。
指向結構體型別資料的指標
第六節 指向結構體型別資料的指標 三 用指向結構體的指標作函式引數 有時想將乙個結構體變數的值傳給另乙個函式,但原來的c標準不允許用結構體變數作為函式引數。那麼用什麼方法來解決這個問題呢?有兩個方法 用結構體變數的成員作引數。例如,用stu 2 name作函式實參,將實參值傳給形參。用法和用普通變數...
指向結構體的指標和指向結構體指標的指標
剛才用結構體的指標,操作記憶體出錯了,記錄一下。struct t ptr 是指向乙個結構體的指標,也可以當做乙個結構體陣列來用。可以把結構體當做 int 來看,int 型別即可以指向乙個整數,也可以指向陣列。struct t ptr,說白了 就是乙個結構體指標的陣列,陣列內都是指標,還要分配記憶體。...
指向結構體的指標和指向結構體指標的指標
例如,struct t ptr 是指向乙個結構體的指標,也可以當做乙個結構體陣列來用。可以把結構體當做 int 來看,int 型別即可以指向乙個整數,也可以指向陣列。struct t ptr,說白了 就是乙個結構體指標的陣列,陣列內都是指標,還要分配記憶體。1,結構體指標用法一 strusysinf...