學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 內容?

 存的方法取的方法
方法一 x=3; y=x+1;
方法二 100號記憶體內容=3; 104號記憶體內容=
100號記憶體內容+1;

    
方法二就是指標的概念。但因變數的記憶體位置,是由系統在執行程式時,依照當時記憶體使用狀況,
臨時配置,無法由使用者決定,所以就必須透過一種專門記錄記憶體位置的變數記錄之。

int x;
int *p;
p=&x;
printf("*p=%d\n",*p);
x=42;
printf("*p=%d\n",*p);
*p=27;
printf("x=%d\n",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 教學