學習C++這麼多年了,數組指針和指針數組還是傻傻分不清?

零、前言

數組指針和指針數組是每一個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();
}

運行結果:
在這裏插入圖片描述

能力有限,如有錯誤,歡迎指教。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章