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
好了今天就寫這麼多,記得段錯誤!!!!