C語言中,數組是數組,指標是指標,兩者是完全不同的,通俗的話來說,一個是地址符號,一個是儲存變數地址的變數。
但是有時候他們又是可以相同的。
於是首先,我們應該知道兩者在什麼時候是“相似”的。
1、“運算式中的數組”就是指標;
2、C語言把數組下標作為指標的位移量;
3、“作為函數參數的數組名”等同於指標;
對數組的引用如a[i]在編譯時間總是被編譯器改寫成*(a+i)的形式。C語言之所以把數組形參轉換為指標是處於效率的考慮,由於不可能對整個數組進行拷貝,而是“所有的數組在作為參數傳遞時都轉化為指向數組起始地址的指標”。
摘自《Expert C Programming》---Peter Van Der Linden
手動實驗1:
[lanux@localhost Program]$ cat pointer_and_array_01.c
#include <stdio.h>
char ga[8]="goblecha";
void print_array(char arr[])
{
printf("/nIn Function print_array:/n");
printf("arr address,on goble ga:%d/n",&arr);
printf("arr[0] address,on goble ga:%d/n",&(arr[0]));
printf("arr[1] address,on goble ga:%d/n",&(arr[1]));
}
void print_pointer(char *ptr)
{
printf("/nIn Function print_pointer:/n");
printf("ptr value, on goble ga:%d/n",&(*ptr));
printf("ptr address,on goble ga:%d/n",&ptr);
printf("ptr[0] address,on goble ga:%d/n",&(ptr[0]));
printf("ptr[1] address,on goble ga:%d/n",&(ptr[1]));
printf(" ++ptr value,on goble ga:%d/n",++ptr);
}
main()
{
printf("/nIn the main:/n");
printf("goble ga adrress:%d/n",&ga);
printf("goble ga[0] address:%d/n",&(ga[0]));
printf("goble ga[1] address:%d/n",&(ga[1]));
print_array(ga);
print_pointer(ga);
printf("/n");
return 0;
}
[lanux@localhost Program]$ gcc -W pointer_and_array_01.c -o test
[lanux@localhost Program]$ ls
a.out notes.1 pointer_and_array_01.c test
[lanux@localhost Program]$ ./test
In the main:
goble ga adrress:134519160
goble ga[0] address:134519160
goble ga[1] address:134519161
In Function print_array:
arr address,on goble ga:-1077022384
arr[0] address,on goble ga:134519160
arr[1] address,on goble ga:134519161
In Function print_pointer:
ptr value, on goble ga:134519160
ptr address,on goble ga:-1077022384
ptr[0] address,on goble ga:134519160
ptr[1] address,on goble ga:134519161
++ptr value,on goble ga:134519161
[lanux@localhost Program]$
初始化的全域變數ga儲存在全域區,而儲存在棧區的函數參數變數,如arr[],*ptr,其實都是一個指標,即一個儲存地址的變數(這裡儲存的地址指向全域字元數組ga)。
01:26:10