我們知道將整數變量加1後,其值會增大1,那麼將指針變量加1後,其值會增大多少呢?
在探討這個問題同時我們也將學習到指針和數組的關係。
工具/原料
Microsoft Visual Studio 2012(或其他版本)
一、指針和數組
多數情況下,C++將數組名解釋為數組第一個元素的地址。
在VS2012中編寫如下測試代碼:
int iArray[3]={1, 2, 3};
int * pi = iArray;
cout << "iArray = " << iArray << endl;
cout << "&iArray[0] = " << &iArray[0] << endl;
cout << "Pi = " << pi << endl;
會輸出什麼?
可以看到上面三個輸出結果是一樣的,也就意味著將一個數組賦給指針後,數組的地址、數組首元素的地址和指針的地址,三者是一樣的。
二、指針運算
我們知道將數組的下標加1就表示數組中下一個元素,那麼將一個指向數組的指針加1後,指針指向什麼呢?
在VS2012中編寫如下測試代碼:
int iArray[3]={1, 2, 3};
double dArray[3]={1.1, 2.2, 3.3};
int * pi = iArray;
double * pd = dArray;
cout << "iArray[0] = " << iArray[0] << endl;
cout << "*Pi = " << *pi << endl;
cout << "&iArray[0] = " << &iArray[0] << endl;
cout << "Pi = " << pi << endl;
cout << "iArray[1] = " << iArray[1] << endl;
cout << "*(Pi+1) = " << *(pi+1) << endl;
cout << "&iArray[1] = " << &iArray[1] << endl;
cout << "Pi + 1 = " << pi+1 << endl;
cout << "\ndArray[0] = " << dArray[0] << endl;
cout << "*Pd = " << *pd << endl;
cout << "&dArray[0] = " << &dArray[0] << endl;
cout << "Pd = " << pd << endl;
cout << "dArray[1] = " << dArray[1] << endl;
cout << "*(Pd+1) = " << *(pd+1) << endl;
cout << "&dArray[1] = " << &dArray[1] << endl;
cout << "Pd + 1 = " << pd+1 << endl;
會輸出什麼?
從上面輸出的結果可以看出:
1、指向數組的指針和數組的第一個元素地址相等;
2、指向數組的指針指向的內容和數組的第一個元素相等;
3、指向數組的指針加1後和數組的第二個元素地址相等;
4、指向數組的指針加1後指向的內容和數組的第二個元素相等;
5、指向int型數組的指針加1後地址增加4個字節;
6、指向double型數組的指針加1後地址增加8個字節;
注:後兩條因系統對不同類型的變量存儲大小而異。
三、數組的運算
上面演示可以對指針進行加減運算,那麼能不能對數組的地址進行加減運算呢?運算的結果是什麼呢?
在VS2012中編寫如下測試代碼:
int iArray[3]={1, 2, 3};
cout << "iArray = " << iArray << endl;
cout << "&iArray[0] = " << &iArray[0] << endl;
cout << "iArray + 1 = " << iArray + 1 << endl;
cout << "&iArray[0] + 1 = " << &iArray[0] + 1 << endl;
cout << "&iArray[1] = " << &iArray[1] << endl;
輸出結果是什麼呢?
從上面的輸出結果可以看出:
1、數組的地址和數組首元素的地址相同;
2、將數組收元素的地址加1和數組第二個元素的地址相同。
這裡有一點有點出乎我的意料,就是我對整個數組的地址加1,結果竟然是第二個元素的地址,我的理解是地址應該偏移整個數組的大小(可以看下面的測試),而不是一個元素的大小,這可能和編譯環境和操作系統有關,不知在Linux下結果如何,有興趣的可以自己測試
在VS2012中編寫如下測試代碼:
int iArray[3]={1, 2, 3};
cout << "iArray = " << iArray << endl;
cout << "&iArray[0] = " << &iArray[0] << endl;
cout << "sizeof(iArray) = " << sizeof(iArray) << endl;
cout << "sizeof(&iArray[0]) = " << sizeof(&iArray[0]) << endl;
輸出結果是什麼呢?
從上面的結果可以看出:
雖然整個數組的地址和數組首元素的地址相同,但是其長度是不同的,對整個數組的地址使用sizeof()得到整個數組佔用內存的大小,而對對數組的首元素地址使用sizeof()得到該元素佔用內存的大小。
注意事項
將指針變量加1,其增加的值等於指向的類型佔用的字節數。
如果您覺得本文對您有所幫助,請點擊右上方或者下方的“有用”,多謝!