C語言基礎四 指標

2021-08-11 16:38:46 字數 3662 閱讀 4828

指標表示乙個位址,什麼型別的指標就應該指向什麼型別的記憶體空間,例如int *型別的指標就應該指向乙個int型別的空間。

int a = 7;

int *p = null; //指標的定義

p = &a; //指標的繫結

*p = 5; //指標的解引用

對於同型別指標p1,p2,一般有這幾種運算

p1+3, p1-3, p2-p1

int a[5] = ;

int *p1 = a; //p1指向第乙個元素

int *p2 = p1 + 3; //p2 指向第4個元素

int c = p2 - p1; //=3,表示相差3個指標所指向的型別的空間。

int

*p[5]; //指標陣列,因為優先順序比價高,所以p表示乙個陣列,裡面存放5個int指標

int (*p)[5]; //陣列指標,p是乙個指標,指向乙個int[5]型別的空間

int **c;

int a1[3] = , a2[3] = ;

int b[2][3] = ;

等價於int b[2][3] = ;

int (*p)[3] = b; //陣列指標可以與二維陣列匹配

//*p 表示的是a1這個陣列,*(p+1)表示a2這個陣列。 **(p+1)表示的是a2中的第乙個元素

//這裡的b和p在參與運算時,相當於二維指標,但是與 c 的型別是不同的,陣列指標p指向int[3],c指向int *。

char (*p)[10];

char arr[10] = ;

//p是乙個陣列指標,他可以與二維陣列arr匹配。

//這裡每行的字元數必須確定,行數可以不用註明,

//因為在記憶體中存放時都是以一維陣列的形式按順序排放的,每行字元數的增減直接影響到下一行的位置,

char arr1[5][10];//三維陣列也必須要確定第二維和第三維的大小,可以與char (*q)[5][10]匹配;

對指標進行強制型別轉換一般是需要 目標指標型別的偏移量 ,或者需要 等號兩邊的指標型別 相互匹配。

char arr = "abcdefghijk";

int *p = (int *)arr + 1;

printf("%c %c %c %c\n", *(char *)p, *((char *)p+1), *((char *)p+2), *((char *)p+3));

//輸出為e f g h

#define addr    0

int *p = (int *)addr;

嵌入式是一種暫存器和記憶體統一編址的硬體裝置,對暫存器讀寫操作時,可以直接對其位址進行操作。

假設位址是乙個合法位址0x7fff1234,這個位址的暫存器是32位暫存器,對這個暫存器讀寫操作

*(int *)0x7fff1234 = 1;

或者將其寫成巨集定義

#define rg *((volatile unsigned int *)0x7fff1234)

int a = rg;

rg = 1;

//volatile 關鍵字,表示經常改變的,編譯器不會做優化,每次都是從記憶體中重新讀取資料。

函式名就是函式的首位址

int * f(int a, int b); //這是乙個返回值為int *型別的函式;

int (*f1)(int a); //函式指標,f1是乙個指標,指向型別是int (*)(int )

int max(int a, int b)  

int main()

intsub(int a, int b)

//定義乙個返回值為func型別的函式,返回值型別為int (*)(int , int )

//int (*calculate(char operate))(int , int )

//通過typedef可以簡化成下面的定義。

func calculate(char operate)

}//最後還需定義乙個使用者呼叫的函式

int cal(int a, int b, char operate)

申請的是堆記憶體。堆記憶體不會自己釋放,直到整個程序執行完畢。

所以malloc( )申請的空間一定要儲存好這段空間的首位址,用完之後free( )釋放.

函式原型

void *malloc(unsigned

int num_bytes);//申請成功,返回這段空間的首位址,不成功返回null

位址為null的空間在核心區域,所以在申請時,一定要判斷是否申請成功

當申請的位元組數為0時,也會申請出乙個最小單位的空間,這個空間用來儲存申請空間的大小。也可以用free()釋放。

int *p = (int *)malloc(sizeof(int) * 5); //在堆記憶體申請5個int空間

if(null == p)

memset(p, 0, sizeof(int) * 5); //給這段空間清零。

//用完這段空間之後

free(p); //指標p在使用時不能移動,否則釋放不徹底,會記憶體洩漏

p = null;//防止野指標亂指。

null

null是一種位址型別的0,(void *)0.

表示記憶體中最低端,也是就系統核心最開始的地方。

const

int a = 1; //a在c和c++中儲存的方式有所不同。

對於全域性變數或者靜態變數,c和c++中都是儲存在資料段,也就是全域性/靜態儲存區;

對於區域性變數

c語言中,和普通區域性變數一樣也是儲存在棧區,

c++中對const進行了優化,如果初始化為常量表示式,將其視為識別符號常量,和巨集定義類似,編譯時直接替換,這叫常量摺疊。

巨集定義是在預編譯階段進行字元替換,替換結束後,就會丟棄原字元。

如果通過 別的變數的值 或者 位址中的值 初始化,就是不可摺疊常量。

《常量摺疊》(constant folding),編譯的時候,任何用到 「a」 的地方,都會直接用常量表示式的值 「1」 去替換。

這時候a的值不需要訪問儲存空間來確定,程式中任何出現 a 的地方在編譯期間就已經被替換,即使通過取位址來修改這個值,也是相當於改變了乙個副本而已,取位址時,編譯器會為a另外分配空間。

c++中const定義的變數是可以用於定義陣列的元素個數。而c語言就沒有這個優化特性,所以c語言的const修飾的變數是不能用來定義陣列元素個數的。

const修飾指標

const

int *a; //*a(a指向的空間)是const的

intconst *a; //同上

int * const a; //位址a是const的

int **const*a; //*a(a指向的空間,型別是int **)是const的,

int *const**a; //**a(a指向的空間內容所指向的空間,型別是int *)是const的,

可以理解為,const修飾它之後的內容,可以將他之後的內容看作是指標運算的表示式(表示修飾的空間)

C語言基礎(四)指標 陣列

2016.7.25 任何型別的一維 二維 三維指標占用空間大小相同4個位元組 32位作業系統 8個位元組 64位 指標與陣列 陣列 表示一段連續的記憶體空間,用來儲存多個相同型別的值。1.陣列名的值是陣列首元素的位址 即陣列名是指向陣列首元素的指標 int array 5 printf array ...

C語言基礎(9) 指標

指標與陣列 指標變數定義的一般形式 型別 指標變數名符號 在變數宣告語句中是指標型別說明符,前面的型別用於宣告指標可以指向哪種型別的變數,稱為指標的基型別。例如 int pt1 int pt2 int a 520 int pt a 用 運算子可以獲取指標變數所指向變數的內容,該運算子被稱為指標變數間...

c語言基礎2指標

指標的詳解 指標的定是 int a b 1 a b 可以看出來,a這個指標變數存的是b的位址。可以變形為int a b d 表示訪問位置100,並取得裡面的值。乙個常見的錯誤,int a a 12 但是a究竟指向 呢,由於我們沒有對a進行初始化,所以我們沒有辦法 12這個值究竟存在 如果變數是靜態的...