C++ 將陣列名解釋為其第一個元素的地址,而對陣列名應用地址運算子時,得到的是整個陣列的地址,從數字上而言,這兩個地址相同,無需區分;但從概念上特別是需要運用指標算術時,需要明白兩者的區別,如下示例中假設 short 寬 2 位元組,系統為 32 位,陣列首地址為0x0028ccf0,指標變數 ptr 和 ptrc 的區別如下:
- 變數
ptr的型別是short*,存盤的是一個 2 位元組記憶體塊的地址,它指向的物件是short型別,記號*ptr與tacos[0]等價, - 變數
ptrc的型別是short(*)[10],存盤的是一個 20 位元組記憶體塊的地址,它指向的物件是包含 10 個元素的short陣列,記號*ptrc與tacos等價,
表示 tacos、&tacos、&tacos[0] 的區別如下:
- 陣列名
tacos和&tacos[0]等效,型別都為short *,存盤的是一個 2 位元組記憶體塊的地址,它們指向的物件是short型別,但在運用sizeof()時,這兩者會有區別,sizeof(tacos)=20而sizeof(&tacos[0])=4, - 表示
&tacos的型別為short(*)[10],存盤的是一個 20 位元組記憶體塊的地址,它指向的物件是包含 10 個元素的short陣列,
//宣告并初始化陣列
short tacos[10] = {5,2,8,4,1,2,2,4,6,8};
//宣告并初始化指標一:以下幾種賦值結果對ptr等效
short *ptr = tacos; //值為0x0028ccf0
short *ptr = &tacos[0]; //值為0x0028ccf0
//宣告并初始化指標二
short (*ptrc)[10] = &tacos;//值為0x0028ccf0
//訪問陣列第三個元素
cout << tacos[2]; //結果為8
cout << *(tacos+2); //結果為8
cout << ptr[2]; //結果為8
cout << *(ptr+2); //結果為8
cout << (*ptrc)[2]; //結果為8
cout << *(*ptrc+2); //結果為8
//應用指標算術時單位1表示的位元組數
cout << int(tacos+1)-int(tacos); //結果為2
cout << int(&tacos[0]+1)-int(&tacos[0]);//結果為2
cout << int(&tacos+1)-int(&tacos); //結果為20
cout << int(ptr+1)-int(ptr); //結果為2
cout << int(ptrc+1)-int(ptrc); //結果為20
//應用sizeof()獲得記憶體量大小
cout << sizeof(tacos); //結果為20
cout << sizeof(&tacos[0]);//結果為4
cout << sizeof(&tacos); //結果為4
cout << sizeof(tacos[0]); //結果為2
cout << sizeof(ptr); //結果為4
cout << sizeof(ptrc); //結果為4
上述例子中陣列名tacos和指標變數ptrc以及ptr的區別如下:
- 陣列名
tacos是常量,值不能修改;ptrc以及ptr是變數,值可以修改, - 對陣列名
tacos使用sizeof()得到的是整個陣列的記憶體量寬度;對ptrc以及ptr使用sizeof()得到的是指標變數的記憶體量寬度,
實際上,上述訪問方式中,C++ 編譯器會自動將 tacos[2]轉換為*(tacos+2),將ptr[2]轉換為*(ptr+2),將(*ptrc)[2]轉換為*(*ptrc+2),前者稱為陣串列示法,后者稱為指標表示法,
本文作者:木三百川
本文鏈接:https://www.cnblogs.com/young520/p/16687935.html
著作權宣告:本文系博主原創文章,著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請附上出處鏈接,遵循 署名-非商業性使用-相同方式共享 4.0 國際版 (CC BY-NC-SA 4.0) 著作權協議,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/507108.html
標籤:C++
上一篇:我想使用計數排序在C中列印一個排序陣列,但我的代碼不起作用
下一篇:C++ 指標與二維陣列名
