物聯(lián)網(wǎng)/嵌入式工程師
重磅升級:新增硬件電路設(shè)計與實戰(zhàn),讓你軟硬通吃,同級PK無敵!行業(yè)風口、政策傾斜,新晉熱門高薪不內(nèi)卷!0基礎(chǔ)一站式就業(yè)完整路徑,搶占先發(fā)優(yōu)勢!
在前面及小結(jié)中,我們學習了指針和數(shù)組的概念,看起來這是兩個完全不同的東西。但其實他們兩者是緊密相關(guān)的,本小結(jié)我們就來探討一下指針和數(shù)組的聯(lián)系。
我們在定義數(shù)組的時候,常常這樣定義,int arr[5];
在 C++ 中,數(shù)組表示的是一段連續(xù)的內(nèi)存存儲空間
如上圖,每個元素之間是沒有空隙的,這樣每個元素的內(nèi)存地址,其實也是有規(guī)律可循的??梢詫戇@樣一個程序,來驗證我們的想法:
#include <stdio.h> int main(int argc,char **argv) { int array[5]; printf("array[0]: %p\n", &array[0]); // %p 用來打印數(shù)組的地址 printf("array[1]: %p\n", &array[1]); printf("array[2]: %p\n", &array[2]); printf("array[3]: %p\n", &array[3]); printf("array[4]: %p\n", &array[4]); return 0; }
程序運行結(jié)果如下:
array[0]: 0x7ffee9d81490 array[1]: 0x7ffee9d81494 array[2]: 0x7ffee9d81498 array[3]: 0x7ffee9d8149c array[4]: 0x7ffee9d814a0
指針的地址以16進制的方式輸出,可以看出,這幾個地址中,每兩個相鄰的地址都相差 4 ,而每一個元素都是 int類型,int 占 4 個字節(jié)大小,說明他們確實是緊密相連的。
驗證了數(shù)組的地址之后,再來看看數(shù)組是如何訪問數(shù)組中的元素的。假設(shè)我們想要訪問第 2 個元素(從 0 開始)
array[1];
那么 C++ 在碰到這行代碼的時候,是先拿到第 2 個元素的地址,然后通過地址去訪問元素,那么如何拿到第二個元素的地址呢?剛剛的實驗證明,數(shù)組中元素的地址都是等差的,所以只要拿到第一個元素的地址,再加上相應(yīng)元素的偏差,就可以拿到第二個元素的地址了。
那么,對于數(shù)組來說,第一個元素的地址是什么的?答案是數(shù)組名。
我們再嘗試寫一個測試程序
#include <stdio.h> int main(int argc,char **argv) { int array[5]; printf("array: %p\n", array); printf("array[0]: %p\n", &array[0]); // %p 用來打印數(shù)組的地址 printf("array[1]: %p\n", &array[1]); printf("array[2]: %p\n", &array[2]); printf("array[3]: %p\n", &array[3]); printf("array[4]: %p\n", &array[4]); return 0; }
程序運行結(jié)果如下:
array: 0x7ffeefa29490 array[0]: 0x7ffeefa29490 array[1]: 0x7ffeefa29494 array[2]: 0x7ffeefa29498 array[3]: 0x7ffeefa2949c array[4]: 0x7ffeefa294a0
我們發(fā)現(xiàn),直接輸出 array 和首元素的地址,是一模一樣的,那么就可以得出一個結(jié)論:數(shù)組名是一個指向數(shù)組首元素的指針
但是這個指針和我們常見的指針有一些不一樣的地方,這個指針是一個常量,所以我們是不可以對其進行修改的。也就是說,我們不能對其進行 array = p 或者 array++ 這樣包含重新賦值的操作,但是我們?nèi)匀豢梢杂弥羔樀挠梅▉聿僮魉?/p>
例如,使用指針的加減法來訪問對應(yīng)的元素
#include <stdio.h> int main(int argc,char **argv) { int array[5]; *(array + 2) = 1; return 0; }
代碼中的 *(array + 2) = 1;
就等價于 array[2] = 1;
我們在前面講過 malloc 分配內(nèi)存的用法。來看一個例子
#include <stdio.h> int main(int argc,char **argv) { int * p = (int *)malloc(5 * sizeof(int)); free(p); return 0; }
在上面的程序中,我們分配出來了一個 5 個 int 大小的儲存空間:
在這塊儲存空間內(nèi),可以存放 5 個 int 類型的數(shù)字,假如想要訪問第 3 個數(shù)字,我們可以把指針向后移動兩個元素的位置,寫成 *(p + 2)
那么指針可不可以按照數(shù)組的訪問方式去訪問呢?p[2]
其實也是可以的,p[2]
和*(p + 2)
在這里是等價的。
請驗證,完成請求
由于請求次數(shù)過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報