C/C++:[10]指針、數組和指針算術?

我們知道將整數變量加1後,其值會增大1,那麼將指針變量加1後,其值會增大多少呢?

在探討這個問題同時我們也將學習到指針和數組的關係。

C/C++:[10]指針、數組和指針算術

工具/原料

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;

會輸出什麼?

C/C++:[10]指針、數組和指針算術

可以看到上面三個輸出結果是一樣的,也就意味著將一個數組賦給指針後,數組的地址、數組首元素的地址和指針的地址,三者是一樣的。

二、指針運算

我們知道將數組的下標加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;

會輸出什麼?

C/C++:[10]指針、數組和指針算術

從上面輸出的結果可以看出:

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;

輸出結果是什麼呢?

C/C++:[10]指針、數組和指針算術

從上面的輸出結果可以看出:

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;

輸出結果是什麼呢?

C/C++:[10]指針、數組和指針算術

從上面的結果可以看出:

雖然整個數組的地址和數組首元素的地址相同,但是其長度是不同的,對整個數組的地址使用sizeof()得到整個數組佔用內存的大小,而對對數組的首元素地址使用sizeof()得到該元素佔用內存的大小。

注意事項

將指針變量加1,其增加的值等於指向的類型佔用的字節數。

如果您覺得本文對您有所幫助,請點擊右上方或者下方的“有用”,多謝!

地址, 指針, 數組, 算術,
相關問題答案