一、什么時(shí)候數(shù)組和指針是相同的
1、表達(dá)式中的數(shù)組名(與聲明不同)被編譯器當(dāng)作一個(gè)指向該數(shù)組第一個(gè)元素的指針
因此如a[i]這樣的訪問都被編譯器改寫或解釋為*(a+i)的形式,同樣取下標(biāo)操作符的操作數(shù)是可交換的,所以a[3]可以寫成3[a],不過通常你不會(huì)這樣做。
2、下標(biāo)總是與指針的偏移量相同,下標(biāo)*sizeof(元素類型)就是偏移數(shù)組起始地址的實(shí)際字節(jié)數(shù)。
3、“作為函數(shù)參數(shù)的數(shù)組名”等同于指針,任何傳遞給函數(shù)的數(shù)組參數(shù)都會(huì)被轉(zhuǎn)換成指針,這是基于效率考慮,避免了數(shù)組的拷貝。在函數(shù)內(nèi)部,數(shù)組參數(shù)都將被轉(zhuǎn)換成一個(gè)指針,要牢記這一點(diǎn),因此如:
void test(char a[10])
{
printf("%d\n",sizeof(a));
}
顯然應(yīng)該打印指針大小4,而非數(shù)組大小。另外,注意數(shù)組參數(shù)的地址跟數(shù)組參數(shù)第一個(gè)元素的地址并不相等,在表達(dá)式中兩者一致,但是在函數(shù)調(diào)用中,由于數(shù)組參數(shù)指針也是臨時(shí)變量,因此兩者的地址是不一樣的。
可以通過下列程序觀察:
#include <stdio.h>
#include <stdlib.h>
void test1(char a[])
{
printf("&a=%x,&(a[0])=%x,&(a[1])=%x\n",&a,&(a[0]),&(a[1]));
}
void test2(char *b)
{
printf("&b=%x,&(b[0])=%x,&(b[1])=%x\n",&b,&(b[0]),&(b[1]));
}
int main(int argc, char *argv[])
{
char ga[]="hello";
printf("&ga=%x,&(ga[0])=%x,&(ga[1])=%x\n",&ga,&(ga[0]),&(ga[1]));
test1(ga);
test2(ga);
system("pause");
return 0;
}
二、指針跟數(shù)組什么時(shí)候不同
1、如果定義了一個(gè)數(shù)組,在其他文件對(duì)它進(jìn)行聲明也必須聲明為數(shù)組,定義和聲明必須匹配,指針也是如此。
2、指針始終是指針,它絕不可以寫成數(shù)組。可以用下標(biāo)形式訪問指針的時(shí)候,一般都是指針作為函數(shù)參數(shù)時(shí),并且你知道傳遞給函數(shù)的實(shí)際是一個(gè)數(shù)組。
3、數(shù)組名是不可改變的左值,因此如
int array[100],array2[100];
array=array2;
array++;
array--;
都將出錯(cuò),但是在函數(shù)內(nèi)部:
int array2[100];
void fun(int array[])
{
array=array2;
}
卻可以,因?yàn)樵诤瘮?shù)內(nèi)部array雖然被聲明為數(shù)組實(shí)際上卻是指針。