零、前言
數組指針和指針數組是每一個C++程序員心中永遠的痛點!即使工作多年,也常常分不清這對”雙胞胎“兄弟!雖然工作中不常使用或者使用了替代方案,但每當你要找一份新工作時,總需要要翻翻看看它們。面試題中經常出現它們的身影,面試官有時候爲了試探你對指針和數組的理解,也喜歡拿它們來說事。
一、數組指針
數組指針本質上是一個“指針”,是一個指向數組的指針,這裏可以把數組當成修飾語,理解成:數組的指針。
在32位系統下永遠佔4個字節(面試考點)。它指向的是一個數組,這個數組佔了多少字節就要視具體情況而定。如:int (*p)[5];,它就是一個數組指針,這個指針指向一個包含了5個整型元素的數組。
二、指針數組
指針數組本質上是一個“數組”,是一個存儲指針的數組,這裏可以把指針當成修飾語,理解成:指針的數組。
它的裏面存放的全是指針,數組佔多少字節有數組本身確定。如:int *parr[5];,它就是一個指針數組,這個數組的裏面存儲了5個整型指針。
三、數組指針和指針數組的識別方法
識別數組指針和指針數組的方法是根據運算符的優先級來判定的,int (p)[5];語句中,小括號()內是一個整體,星號和p構成一個整體,是一個指針,然後這個指針再指向後面的數組,這是一個數組指針。
在int parr[5];語句中,中括號[]的優先級高於星號的優先級,[]先和p結合構成一個數組,然後這個數組再去和前面的*結合,這是一個指針數組。
四、數組指針和指針數組的使用
1、數組指針和指針數組的內存
數組指針:int (*p)[5];語句中,(*p)是一個指針,p映射到內存中就是在堆區,它指向包含5個int類型元素的數組,它的大小是5*4=20
字節。
指針數組:int *p[5];語句中,p[5]是一個數組,p映射到內存中就在存儲在棧區,裏面包含5個int類型的指針,每一個指針的大小是4字節,所以這個指針數組的大小是5*4=20
字節。
發現沒,大小怎麼會一樣呢?其實,意義不一樣的,來定義成char型試試看。
數組指針:char (*p)[5];語句中大小是5*1=5
字節。
指針數組:char *p[5];語句中大小事5*4=20
字節。
2、代碼測試
// TestArray.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
cout << "-----------------------------數組指針和指針數組使用-----------------------------------------" << endl;
// 數組指針
int arr[5] = {1,2,3,4,5};
int(*p)[5] = &arr;
// 指針數組
int *parr[5] = {};
int *p1,*p2,*p3,*p4,*p5;
int num1 = 1;
int num2 = 2;
int num3 = 3;
int num4 = 4;
int num5 = 5;
p1 = &num1;
p2 = &num2;
p3 = &num3;
p4 = &num4;
p5 = &num5;
parr[0] = p1;
parr[1] = p2;
parr[2] = p3;
parr[3] = p4;
parr[4] = p5;
// 數組指針
char arrCh[5] = { 'a','b','c','d','e' };
char(*pCh)[5] = &arrCh;
// 指針數組
char *parrCh[5] = {};
char *pCh1, *pCh2, *pCh3, *pCh4, *pCh5;
char numCh1 = 'a';
char numCh2 = 'b';
char numCh3 = 'c';
char numCh4 = 'd';
char numCh5 = 'e';
pCh1 = &numCh1;
pCh2 = &numCh2;
pCh3 = &numCh3;
pCh4 = &numCh4;
pCh5 = &numCh5;
parrCh[0] = pCh1;
parrCh[1] = pCh2;
parrCh[2] = pCh3;
parrCh[3] = pCh4;
parrCh[4] = pCh5;
cout << "-----------------------------元素全是int類型時------------------------------------" << endl;
cout << "sizeof(*p)=" << sizeof(*p) << " sizeof(parr)=" << sizeof(parr) << endl;
cout << "-----------------------------元素全是char類型時-----------------------------------" << endl;
cout << "sizeof(*pCh)=" << sizeof(*pCh) << " sizeof(parrCh)=" << sizeof(parrCh) << endl;
cout << "-----------------------------遍歷數組指針-----------------------------------------" << endl;
for (int i=0; i<5; i++)
{
cout << (*p)[i] << endl;
}
cout << "-----------------------------遍歷指針數組-----------------------------------------" << endl;
for (int i = 0; i < sizeof(parr) / sizeof(int); i++)
{
cout << *parr[i] << endl;
}
std::cout << "Hello World!\n";
getchar();
}
運行結果:
能力有限,如有錯誤,歡迎指教。。。