指標和結構體

2021-07-03 10:16:12 字數 2686 閱讀 4726

struct test//定義乙個名為test的結構體 

; test pn1;//定義結構體變數pn1

test pn2;//定義結構體變數pn2

pn2.a=10;//通過成員操作符.給結構體變數pn2中的成員a賦值

pn2.b=3;//通過成員操作符.給結構體變數pn2中的成員b賦值

test* point;//定義結構指標

point=&pn2;//指標指向結構體變數pn2的記憶體位址

point->a=99;//通過結構指標修改結構體變數pn2成員a的值

struct student;  

//重點記住,在結構體中含有指標需要為指標指定指向的記憶體位址

student stu,*pstu;

//結構體成員需要初始化

stu.name = new

char; = (char*)malloc(sizeof(char));

strcpy(stu.name,"ddd");

stu.score = 99;

//結構體成員需要初始化

pstu = new student;//pstu = malloc(sizeof(student));

pstu->name = new

char

//在用結構體指標的=時候先為整個結構體分配記憶體,然後再為結構體內部的指標申請記憶體。

//最後在根據那個地方new,然後進行delete

delete stu.name;

stu.name = null;

delete pstu.name;

pstu->name = null;

delete pstu;

pstu = null;

//記住最後一定將指標賦值為null,防止指標亂指,成為野指標。

struct data

struct stu /*定義結構體* /

;//結構體初始化

struct stu a;

a.name = "gaoqinag";//在宣告的時候自動在棧為陣列進行記憶體分配

a.birthday.year = 2013;//對於巢狀的結構體同樣適用,自動 申請記憶體。

a.birthday.month = 12;

這樣的結構體,成員指標或者分配記憶體,或者指向常量區,不然它們就都是野指標;分配記憶體的話,就要釋放,分配記憶體的時候,是從外向裡,即先分配結構體的指標,再分配成員指標,釋放的時候,是從裡向外,先釋放成員指標,再釋放結構體指標,順序不能錯的。總之每個malloc都要對應乙個free,每乙個new要對應乙個delete!

structdata/*定義結構體型別*/ 

;structstu/*定義結構體型別*/

;main()

, ,

,};

/*定義結構體陣列並初始化*/

p=student;/*將陣列的首位址賦值給指標p,p指向了一維陣列student*/

printf("\n1----outputname,number,year,month,day\n");

for(i=0;i<4;i++)/*採用指標法輸出陣列元素的各成員*/

printf("%20s%10ld%10d//%d//%d\n",(p+i)->name,(p+i)->num,

(p+i)->birthday.year,(p+i)->birthday.month,

(p+i)->birthday.day);

}

#include

#include

using

namespace

std;

//結構體定義

struct student;

int main()

void printbyvalue(student one)

void printbyhand(student *p)

void printbyquote(student &one)

這種方式值採取的「值傳遞」的方式,將結構體變數所佔的記憶體單元的記憶體全部順序傳遞給形參。實際上在被呼叫函式,重新在棧中分配記憶體,將實參的值,進行賦值,在被呼叫函式操作時新申請記憶體的形參,和實參半點關係沒有。採用值傳遞的方式,如果在函式被執行期間改變了形參的值,該值不能反映到主調函式中的對應的實參,這往往不能滿足使用要求。因此一般較少使用這種方法。

這種方式雖然也是值傳遞的方式,但是這次傳遞的值卻是指標。通過改變指標指向的結構體變數的值,可以間接改變實參的值。並且,在呼叫函式期間,僅僅建立了乙個指標變數,大大的減小了系統的開銷。

形參是對應的結構體型別的引用,虛實結合時傳遞的是位址,因而執行效率比較高。而且,與指標作為函式引數相比較,它看起來更加直觀易懂。因而,引用變數作為函式引數,它可以提高效率,而且保持程式良好的可讀性。

void getstu(student** stu)

student *temp;//宣告乙個結構體指標

*temp->name = "hah"

//程式會報錯,沒有給結構體指標變數賦值呢。

getstu(&temp);

cout

<<(*temp).score<<(*temp).name

結構體指標和結構體陣列

struct ha 100 b,c 3 d 結構體指標其實是乙個指標,它儲存的是指向某個結構體的 位址 所以結構體指標陣列儲存的其實是指向一組結構體的 位址 陣列,它本身並不包含結構體的具體內容 沒有被分配記憶體 所以當用到他們時,要麼重定向,比如 d b 讓d指向b,d儲存的是b的位址,這樣就能通...

和結構體 9 3 結構體指標

01指向結構體變數的指標 1 指向結構體物件的指標變數既可以指向結構體變數,也可指向結構體陣列中的元素。2 指標變數的基型別必須與結構體變數的型別相同。3 c語言中允許把 p num用p num來代替,代表乙個箭頭,p num表示p所指向的結構體變數中的num成員。02指向結構體陣列的指標 1 p ...

結構體和指標

結構體中的各個成員是按順序連續存放在記憶體中的。如果乙個結構體指標指向結構體變數,結構體指標所儲存的值是它所指向的結構體變數所佔記憶體的首位址。struct student s1 略去對s1進行賦值的 struct student p p s1 printf d,s p number,p name ...