《複習》指標結構體內存分配

2021-07-04 02:56:50 字數 2860 閱讀 3846

一.指標

指標的重要性

指標是c語言的靈魂

定義位址

記憶體單元的編號

從0開始的非負整數

範圍:0-ffffffff

指標指標就是位址,位址就是指標

指標變數是存放在記憶體單元位址的變數

指標的本質是乙個操作受限的非負整數

分類1.基本型別的指標

p=&i;

*p和i等價(修改*p和i都能改變記憶體上儲存的值);

2.指標與陣列的關係

可以通過指標修改陣列的值,陣列名為陣列第乙個元素的位址

指標變數都只佔四個位元組

例子1.通過指標改變變數值

#include void f(int *p)

int main()

例子2.陣列與指標

#include void show_array(int * p, int len)

例子4.修改指標的位址

#include //void f(int * p);

void f(int ** q);

int main()

void f(int ** q)

2.結構體

為什麼會出現結構體

為了表示複雜的資料

什麼叫結構體

使用者自己定義的資料型別

如何使用

兩種方式

struct student st = ;

struct student * pst=&st;

1.st.sid = 99;

2.pst->sid=99;

//等價於(*pst).sid 等價於st.sid

注意事項:

結構體變數不能加減乘除,只能相互賦值;

例子1.結構體

#include #include struct student

;int main()

; //printf("%d %s %d\n", st.sid, st.name, st.age);

st.sid = 99;

= "lisi" error c中string不能直接賦值!!!

strcpy(st.name, "lisi");

st.age = 22;

printf("%d %s %d\n", st.sid, st.name, st.age);

return 0;

}

例子2.用指標改變結構體變數

#include #include struct student

;int main()

; //printf("%d %s %d\n", st.sid, st.name, st.age);

struct student * pst;

pst = &st;

pst->sid =99; //等價於(*pst).sid 等價於st.sid

/*st.sid = 99;

= "lisi" error c中string不能直接賦值

strcpy(st.name, "lisi");

st.age = 22;

printf("%d %s %d\n", st.sid, st.name, st.age);

*/ return 0;

}

例子3.通過函式中的指標改變和列印結構體

#include #include void f(struct student *pst);

void g(struct student st);

void g2(struct student *pst);

struct student

;int main()

//耗記憶體 耗時間 不推薦

void g(struct student st)

void g2(struct student *pst)

void f(struct student *pst)

3.動態記憶體的分配和釋放

例子1.使用malloc通過指標定義陣列(申請記憶體)

#include #include int main()

; int len;

printf("輸入陣列長度");

scanf("%d", &len);

int *parr = (int *)malloc(sizeof(int)*len); //可以把parr當陣列使用

*parr=9; //類似a[0]=4;

parr[1]=10;

*(parr+2)=11;

printf("%d %d %d\n",*parr, *(parr+1), *(parr+2));

free(parr);

return 0;

}

例子2.跨函式使用記憶體

/***********跨函式使用記憶體*********/

#include#includestruct student

;struct student * createstudent(void);

void showstudent(struct student *);

int main()

student *createstudent(void)

void showstudent(struct student *pst)

結構體內存分配 舉例待續

定義結構體型別,系統不為之分配記憶體單元。當使用結構體型別定義變數時,才開闢記憶體單元。結構體在記憶體中所佔的大小決定於兩點 1.編譯器預設或指定對齊數 eg 64為ubuntu14.04 預設8 這個可通過 pragma pack n 來指定 2.每個成員 實際有效對齊數,指的是所有成員中所佔位元...

C C 中結構體內存分配問題

有人問起當乙個結構體裡面只有乙個char型元素的時候,為什麼這個型別的變數也佔了四個位元組呢.下面我們來看一下 對於乙個結構體,裡面的元素排列順序不同,那麼分配的空間也會不同.我們在vc6.0下看如下結構體 struct test 當開闢乙個如上結構體型別的空間的時候,系統為它準備的是16個位元組的...

結構體內存分配對齊策略

win32 平台下的微軟 c編譯器 cl.exe for 80 86 的對齊策略 1 結構體變數的首位址是其最長基本型別成員的整數倍 備註 編譯器在給結構體開闢空間時,首先找到結構體中最寬的基本資料型別,然後尋找記憶體位址能是該基本資料型別的整倍的位置,作為結構體的首位址。將這個最寬的基本資料型別的...