發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標  題: 星星流講座 0031
發信站: ☆清華電機☆ (Wed Jun 21 15:47:48 1995)
轉信站: star

星星流講座 0031         C 語言教室

第 5 講 之 7            陣列與指標
                        Topic: Difference between array and pointer

前面我們提到註標 [] 相當於指標的引用,例如:

        a[1] 相當於 *(a+1)

那麼,如此說來,a[1] 也相當於 *(1+a),也就是我可以用

        1[a]

來代表 a[1]?看起來很奇怪,請你執行一下下面的程式:

/* strange.c */
#include <stdio.h>

void main (void)
{
    int a[10];

    1[a] = 1;
    printf ("%d %d %d\n", a[1], *(a+1), 1[a]);
}

執行結果:

1 1 1

但是,既然指標這麼好用的話,我們直接定義一個指標來用就好,為什
麼要大費周章宣告一個陣列來儲放資料呢?我直接利用指標不就得了?

事實上,宣告一個陣列的同時,電腦就會配置與該陣列等量大小的記憶
體供陣列使用
。我們可以把陣列想成是你銀行戶頭裡的現金,指標則是
提款卡,空有提款卡而戶頭裡沒有現金是不能領出錢來的,同樣地空有
指標而沒有實際可用的記憶體仍然不能存放資料。

許多坊間的書籍誤導讀者以為 char* 就是字串,這是完全錯誤的觀念。
字串是字元陣列,不是字元指標,我們平常是為了操作上的方便才
使用指向字元陣列的指標來操作字串。

如果不定義字元陣列,隨便將一個字元指標指向字串會發生什麼結果呢?
請你執行一下下面的程式:

/* danger.c */
#include <stdio.h>
#include <string.h>

void foo (void);

char *danger;

void main (void)
{
    foo ();
    printf ("%s\n", danger);
}

void foo (void)
{
    strcpy (danger, "Danger!");
}

執行結果:(我們的老朋友)

Segmentation fault (core dumped)

如果把 char *danger; 改成了 char danger[20]; 又會如何?
請你自己動手試試。

--
本文原作者為徐振家,原作刊載於星星神教總壇 ☆清華電機☆ test 板。
你可以以電子文件的形式將本文自由流傳於台灣學術網路,但必須包含此版權聲明。
原作者依中華民國著作權法之規定,享有本文之著作權,請勿抄襲以免觸法。
未經授權任何人不得以任何形式對本文做任何修改及商業上之應用。
其他網路的轉載或其他用途的應用,請先知會作者,並取得其同意。
對本文有任何疑問或意見請 mail 給 ax.bbs@bbs.ee.nthu.edu.tw,謝謝。