指標的運算和malloc

2021-10-04 21:53:03 字數 1705 閱讀 1609

給指標加1表示要讓指標指向下乙個變數

int a[10];

int *p=a;

*(p+1)即是a[1]

如果指標不是指向一片連續分配的空間,如陣列,則這種運算沒有意義

加減乙個整數(+,+=,-,-=)

遞增遞減(++,–)

兩個指標相減(得到的是兩個陣列位址間能放幾個這樣的型別)

指標比較

<,<=,==,>,>=,!=都可以對指標做,用於比較它們在記憶體中的位址位置,陣列中的單元的位址肯定是線性遞增的

取出p所指的那個資料,之後把p移到下乙個位置去,常用於陣列類的連續空間操作

無論指向什麼型別,所有的指標的大小都是一樣的,因為都是位址,但是指向不同型別的指標不能直接相互賦值。(可以做強制轉換型別,但容易出錯)

型別轉換

void表示不知道指向什麼型別的指標,計算時與char相同(但不相通)

指標可以轉換型別:

int

* p=

&i;void

* q=

(void

*)p;

這並沒有改變p所指的變數的型別,而是讓後人讓不同的眼光通過p看它所指的變數,當它是void

在ansi標準中,使用陣列時,往往不能在程式執行後改變陣列大小,malloc()和free()函式可以做到動態分配記憶體給陣列。包含在標頭檔案stdlib.h中(有些編譯器在malloc.h中)

malloc()用以向作業系統申請分配記憶體,申請的大小是以位元組為單位的;free()用以在使用完畢後釋放掉所佔記憶體。一般返回的結果是void,需要型別轉換為自己需要的型別:如果陣列是int,要強制轉換:(int )malloc(nsizeof(int))

#include

int*a=

(int*)

malloc

(n*sizeof

(int))

;free

(a)

free()

把申請得到的空間還給系統,只能還申請來的空間的首位址

常見問題

舉例

c99可以直接通過輸入乙個變數number,int a[number];的方式就能動態分配記憶體。

#include

intmain

(void

)for

(i=number-

1;i>=

0;i--

)return0;

}

c99以前,要用malloc函式

#include

#include

//宣告標頭檔案

intmain

(void

)for

(i=number-

1;i>=

0;i--

)free

(a);

//free原位址

return0;

}

如果程式中要用到動態分配的記憶體,並且會在函式之間傳遞,不要讓函式申請記憶體後返回給呼叫者,因為很有可能會忘了free,或找不到合適的時機去free

好的模式是讓呼叫者自己申請,傳位址進函式,函式再返回這個位址出來

語言malloc和指標傳遞陷阱

最近寫二叉樹的基本操作的時候發現了這個問題,所以寫了個簡單的例子,做個筆記 下列初始化陣列過程 include void init array int arr,int size int main return 0 然後執行發現 也就是說陣列並沒有被初始化。後來找到發現問題在這裡arr int mal...

結構體指標malloc

有如下結構體型別 typedef struct test,ptest 定義乙個結構體指標,結構體指標指向的元素buffer指向32位元組的字串 ptest pdata pdata test malloc sizeof test 32 此時pdata指向的記憶體空間分配如下 如果需要讀寫buffer指...

C 指標的定義和指標的運算

一談起指標,會不會有人跟我一樣感到有些害怕?最開始在學習c語言時,剛接觸指標,讓我感覺很頭大,感覺沒能很深入的理解。在重新學習理解了之後,寫了這篇部落格。指標 pointer 是程式語言中的乙個物件,利用位址,它的值直接指向存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位...