1. 程式人生 > >c語言中陣列名與指標的區別與聯絡

c語言中陣列名與指標的區別與聯絡

今天在工作中定義陣列的時候習慣性的使用char型指標後直接等於字串,但在編譯通過後執行的時候產生了段錯誤,因為著急就(整個函式程式碼還是比較多的)沒仔細看程式碼,只是抱著試試看的心態,將定義換成了陣列後等於字串的形式,居然沒有在出現段錯誤,感到很奇怪(剛乾程式設計師沒多久,一直以為陣列名就是指標呢)。在這裡做個記號,提醒我以後有時間的時候查一下段錯誤的原因。今天先總結一下剛從網上找到的陣列名和char型指標的區別和聯絡。

1.陣列名不是指標;

2.陣列名可以當做一個指標常量使用;

3.指向陣列的指標,就緊緊是一個指標;

4.當函式形參使用陣列名是,其會被轉換成一個單純的指標。

以下是證明上面四點的論據:

1. 首先陣列名不是指標,這很容易證明。



#include <string.h>
#include <stdio.h>
int main()
{
        char str1[]="Hello world!";
        char *str2="Hello world!";
        printf("Size of str1 is: %d\n",sizeof(str1));
        printf("Size of str2 is: %d\n",sizeof(str2));
        printf("Size of char is %d\n",sizeof(char));
        return 0;
}

執行結果如下:

Size of str1 is: 13
Size of str2 is: 8
Size of char is 1

顯然一個指標的長度應該是8(我是在64位機器上編譯的),而不應該是13,。 至於第三個列印只是想說明sizeof是一個運算子。

2.陣列名是一個常量指標。
#include <stdio.h>
#include <string.h>
int main()
{
   char str1[20] = "Hello world!";
   char str2[20];
   strcpy(str2,str1);
   printf("str1:%s\n",str1);

   printf("str2:%s\n",str2);
   return 0;
}

這段程式碼編譯沒有出錯

輸出是

str1:Hello world!

str2:Hello world!

strcpy函式原型是char *strcpy(char *dest, const char *src);  顯然它的兩個引數均為char型指標,而上面程式碼中傳入的str1,str2均為陣列名,這說明陣列名的確可以當成指標使用。至於為什麼是指標常量呢,請看下面一段程式碼。



#include <string.h>
#include <stdio.h>
int main()
{
        char str[20]="Hello world!";
        str++;
        return 0;
}

在編譯是報錯了:

main.c: In function ‘main’:
main.c:6: error: lvalue required as increment operand

str雖然可以當做指標使用但是不能對他進行++,--,或者其他運算,綜合上面兩個例子,我們基本可以認為它可以當做一個常量指標使用。

3.指向一個數組的指標,你也還是一個指標而已。

#include <string.h>
#include <stdio.h>
int main()
{
        char str1[]="Hello world!";
        char *str2=str1;
        printf("Size of str1 is: %d\n",sizeof(str1));
        printf("Size of str2 is: %d\n",sizeof(str2));
        return 0;
}

這段程式碼執行結果是:

Size of str1 is: 13
Size of str2 is: 8

4.作為函式形參的陣列名將會失去其陣列名的地位,變成一個普通的指標。

#include <string.h>
#include <stdio.h>
int fun(char str[])
{
        printf("Size of str is:%d\n",sizeof(str));


}


int main()
{
        char str1[]="Hello world!";
        fun(str1);
        return 0;
}

結果是:

Size of str is:8

好了今天就寫這麼多,記得段錯誤!!!!