學C語言如果不會用指標,那千萬別說學過 C,另外,要判定 C 語言的功力深淺,指標的觀念是判定方法之一。 C 語言中特有的指標,可以透過記憶體映射的方式直接控制硬體,這也是為什麼 C 語言在硬體系統特別強大的原因,包括資料結構(陣列/堆疊/鏈結串列/樹/圖)、演算法、系統程式(作業系統/編譯器),都會進一步使用到。 C 語言的指標對初學者來說,一開始無法建立正確的觀念、導致後續指標語法指來指去,指到最後往往變成噩夢,而中斷學習,或是只學到 C 語言的高階指令部分而已。 【重點整理】 1.指標是一種以記憶體映射的方式控制硬體,此硬體包刮記憶體或周邊硬體 I/O。 2.指標佔用記憶體大小與映射的資料型態無關。 3.指標佔用記憶體大小與作業系統能管理的記憶體大小有關。 以目前64位元作業系統而言,可使用到64位元記憶體,指標佔用記憶體大小 為 64/8=8 bytes。 4.指標 +1 的意思,是讓指標加上 "指向的資料型態長度"。 5.指標的指標,記錄 指標的位址。 6.陣列名為一種指標常數,指向陣列起始點。 7.陣列與指標的差別: A.一個是常數,另一個是變數。 B.一個會配置記憶體空間,另一個不會。 思考一個問題: 當宣告一個記憶體使用權時,如何存起這個記憶體? 例如: int x=100; 爾後如何存取 x 內容?
臨時配置,無法由使用者決定,所以就必須透過一種專門記錄記憶體位置的變數記錄之。
【範例演練】 #include <stdio.h> #include <stdlib.h> int main() { char x1="a",x2="b"; int y1=42,y2=73; char *pc=&x2; int *pi=&y2; //sizeof 求佔用記憶體大小 printf("sizeof(char)=%d , sizeof(int)=%d\n",sizeof(char), sizeof(int)); //求 pc 所指的記憶體內容,指標的佔用記憶體大小,指標的內容 printf("*pc=%c , sizeof(pc)=%d , x2 address=%ld\n",*pc,sizeof(pc),pc); pc++;//指標+1是指向下一個變數的位址 printf("*pc=%c , sizeof(pc)=%d , x2 address + 1=%ld\n",*pc,sizeof(pc),pc); printf("*pi=%d , sizeof(pi)=%d , y2 address=%ld\n",*pi,sizeof(pi),pi); pi++; printf("*pi=%d , sizeof(pi)=%d , y2 address + 1=%ld\n",*pi,sizeof(pi),pi); pc=&x1; printf("*pc=%c , sizeof(pc)=%d , x1 address=%ld\n",*pc,sizeof(pc),pc); pi=&y1; printf("*pi=%d , sizeof(pi)=%d , y1 address=%ld\n",*pi,sizeof(pi),pi); printf("&pc=%ld , &pi=%ld\n",&pc,&pi); } 1.請修改上面的程式,加入 long int z1,*pl; 並測試 long int 及指標 pl 的記憶體佔用量。 2.請修改上面的程式,加入 long long int z1,*pll; 並測試 long long int 及指標 pll 的記憶體佔用量。 ppt 教學 |