1. 程式人生 > >[基礎知識]6.陣列與指標的區別

[基礎知識]6.陣列與指標的區別

下面程式碼的執行結果是?

int GetSize(int data[]){
  return sizeof(data);
}
int _tmain(int argc, _TCHAR* argv[])
{
	int data1[] = {1,2,3,4,5};
	int size1 = sizeof(data1);
	
	int* data2 = data1;
	int size2 = sizeof(data2);
	
	int size3 = GetSize(data1);
	
	printf("%d, %d, %d",size1, size2, size3);
}
  • 分析
    data1是一個數組,sizeof(data1)是求陣列的大小。這個陣列包含5個整數,每個整數佔4位元組,因此總共佔用20位元組。data2宣告為指標,儘管它指向了陣列data1的第一個數字,但它的本質仍然是一個指標。在32位系統上,對任意指標求sizeof,得到的結果都是4。在C/C++中,當陣列作為函式的引數進行傳遞時,陣列就自動退化為同類型的指標
    。因此,儘管函式GetSize的引數data被宣告為陣列,但它會退化為指標,size3的結果仍然是4。答案:20, 4, 4

相關知識點:
除了以下三種情況外,在使用陣列時,陣列都會自動轉換為指向第一個元素的指標
情況1:陣列用作取地址操作符&的運算元
情況2:陣列用作sizeof操作符的運算元
情況3:用陣列對陣列的引用進行初始化

int main()
{
    char a[] = {'1', '3', '5', '7', '9'};
    char (&b)[5] = a;
    cout << sizeof(a) << endl;
cout << sizeof(*a) << endl; cout << sizeof(&a) << endl; cout << sizeof(a[0]) << endl; cout << sizeof(&a[0]) << endl; cout << *((char*)(&a + 1) - 1) << endl; cout << sizeof(b) << endl; cout <<
sizeof(*b) << endl; cout << sizeof(&b) << endl; cout << sizeof(b[0]) << endl; cout << sizeof(&b[0]) << endl; return 0; }

答案:5 1 4 1 4 9 5 1 4 1 4