生活札記 首頁 生活札記
提供一個可以讓大家無拘無束的討論園地
 
相簿相簿   常見問題常見問題   搜尋搜尋   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 


C語言系列課程 NO.20 指標

 
發表新主題   回覆主題    生活札記 首頁 -> C/C++
上一篇主題 :: 下一篇主題  
發表人 內容
luckyhoo



註冊時間: 2006-07-19
文章: 447

發表發表於: 星期一 八月 28, 2006 8:03 pm    文章主題: C語言系列課程 NO.20 指標 引言回覆

>>範例一
指標可說是C程式語言在運用彈性與效率上凌駕許多程式語言的原因之一,學程式的人都會知道的一件事情,就是無論是變數或是陣列,只要宣告定義了之後,它們在記憶體裡就會佔了一個位置,至於裡頭要放的內容為何,就由設計程式的人自行決定了,指標最大的功能就是能夠將變數所在的記憶體位址與其內容分開處理。
這看起來似乎沒啥作用,但讓我們想想看,若你要將包含有1000個陣列元素的陣列傳給一個函式時,這就可以看出指標的功用,你只消將該陣列所在的位址傳給該函式就可以了,不然若是把這個陣列裡的內容一個個慢慢傳遞,那未免太沒效率了。不過,話說回來,指標可說是把二面刃,雖然好用,但若是處理不當,卻是會造成極大的困擾,待會於範例程式即可了解。

原始程式碼:
代碼:

01 #include <stdio.h>
02
03 void test(int *);
04
05 main(void)
06 {
07  int Count=0;
08  int A[5]={0, 1, 2, 3, 4};
09
10  for(Count=0; Count<4; Count++)
11     printf("%d ", A[Count]);
12  printf("\n");
13 
14  test(A);
15
16  for(Count=0; Count<4; Count++)
17     printf("%d ", A[Count]);
18  printf("\n");
19 }
20
21 void test(int *B)
22 {
23  int Count=0;
24
25  for(Count=0; Count<4; Count++)
26     *(B+Count)+=Count;
27 }


程式編譯、執行與結果:
代碼:

luckyhoo@S10:~$ gcc -o ex ex.c
luckyhoo@S10:~$ ./ex
0 1 2 3
0 2 4 6


原始程式碼說明:
14 test(A);
21 void test(int *B)
22 {
23 int Count=0;
24
25 for(Count=0; Count<4; Count++)
26 *(B+Count)+=Count;
27 }

由最後輸出顯示的結果,我們可以知道,在執行了test( )函式後,陣列A的值就改變了,這是因為傳遞給test( )函式的引數是陣列A所在的位址,所以在test( )函式裡頭雖然已經改為指標B了,但事實上指標B所指向的位址仍然是陣列A所在的位址,並沒有另外複製一份。


>>範例二
由前一個範例裡頭,可以了解到,其實撇開一般像是char、int、float、double之類資料型態的指標不提,可以了解到字串和指標其實是一體的二面,一維陣列其實就等於是「*」的指標,二維陣列其實就等於是「**」的指標,……,依此類推,差別僅在於陣列一開始就必須指定有多少個陣列元素,而指標則不必,可於需要時再行配置,為了更了解這段話的意思,我們來看看下面的範例程式。

原始程式碼:
代碼:

01 #include <stdio.h>
02
03 main(void)
04 {
05  int Count=0, Array=0;
06  int *A;
07
08  printf("Use Array Number:");
09  scanf("%d", &Array);
10  A=(int *)malloc(sizeof(int)*Array);
11
12  for(Count=0; Count<Array; Count++)
13     A[Count]=Count*2;
14  for(Count=0; Count<Array; Count++)
15     printf("%d ", A[Count]);
16  printf("\n");
17 }


程式編譯、執行與結果:
代碼:

luckyhoo@S10:~$ gcc -o ex ex.c
luckyhoo@S10:~$ ./ex
Use Array Number:10
0 2 4 6 8 10 12 14 16 18


原始程式碼說明:
10 A=(int *)malloc(sizeof(int)*Array);
為指標A配置足夠的記憶體。
12 for(Count=0; Count<Array; Count++)
13 A[Count]=Count*2;
14 for(Count=0; Count<Array; Count++)
15 printf("%d ", A[Count]);

依序為指標A所指向陣列的元素設定初值後,再依序將指標A所指向陣列的元素內容依序列出。
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    生活札記 首頁 -> C/C++ 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作