指標表示乙個位址,什麼型別的指標就應該指向什麼型別的記憶體空間,例如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這個值究竟存在 如果變數是靜態的...