一.指標
指標的重要性
指標是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通過指標定義陣列(申請記憶體)
例子2.跨函式使用記憶體#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;
}
/***********跨函式使用記憶體*********/
#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 結構體變數的首位址是其最長基本型別成員的整數倍 備註 編譯器在給結構體開闢空間時,首先找到結構體中最寬的基本資料型別,然後尋找記憶體位址能是該基本資料型別的整倍的位置,作為結構體的首位址。將這個最寬的基本資料型別的...