發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標  題: 星星流講座 0030
發信站: ☆清華電機☆ (Sat Jun 17 15:25:24 1995)
轉信站: star

星星流講座 0030         C 語言教室

第 5 講 之 6            陣列與指標
                        Topic: Relationship between array and pointers

現在請看看下列的程式:

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

void strcpy (char *s1, char *s2);

void main (void)
{
    char a[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
    char b[6];

    strcpy (b, a);
    printf ("%s %s\n", a, b);
}

void strcpy (char *s1, char *s2)
{
    while (*s1++ = *s2++)
        ;
}


上面的程式中我們自己寫了 strcpy 這個函數,而不用 string.h 中的 strcpy,
這只是為了做一個示範而已,順便讓各位知道一下 string.h 中的函數是如何做
出來的。

這個程式第一個值得說明的地方是

char a[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

這是給定陣列初始值的方法之一,它的意思是把 H、e、l、l、o、\0 等六個字元
依序放進 a[] 這個陣列裡。如果我寫成這個樣子成不成呢?

char a[6];
a[] = {'H', 'e', 'l', 'l', 'o', '\0'};


答案是不成。這時候你得乖乖的寫成:

a[0] = 'H';     a[1] = 'e';     a[2] = 'l';
a[3] = 'l';     a[4] = 'o';     a[5] = '\0';


第二個值得說明的地方是:

strcpy (b, a);

奇怪在哪裡呢?你有沒有發現 strcpy 的原型是宣告成

void strcpy (char *s1, char *s2);

它要的是兩個指標,可是我們卻傳給他陣列?其實給定一個
陣列 a[], a 這個變數這時候就代表指向陣列第一個元素 a[0] 的指
標:


        ┌─ a 其實就是指向 a[0] 的指標
        ↓        
        ┌┬┬┬┬┬┬……┐
        └┴┴┴┴┴┴……┘    陣列 a[]

註標 [] 其真正的意義就是引用指標。這句話有些難以理解,但是請你看看
這個式子你就能了解了:
       
        a[0] 相當於 *a 即相當於 *(a+0)
        a[2] 相當於 *(a+2)

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