簡體   English   中英

在C ++中初始化指向數組的指針的正確方法?

[英]Correct way to initialize pointer to array in C++ ?

考慮代碼:

const int MAX = 3;
int (*array)[MAX]  ;

int intArray[3] = {30 , 40 , 50};

array = &intArray;
for (int h = 0 ; h < MAX ; h++)
{
    std::cout << *(array[h]) << std::endl;
}

輸出為:

30
0
3

顯然,什么是錯的與陣列的初始化,為什么會30 , 0 , 3而不是30,40,50

就像這樣:

const int MAX = 3;
int *array;

int intArray[3] = {30 , 40 , 50};

array = intArray;
for (int h = 0 ; h < MAX ; h++)
{
    std::cout << array[h] << std::endl;
}

C ++中內置數組的處理非常特殊,尤其是在考慮指針時。 指針可以看作是以下兩種情況之一:

  • 作為指向單個對象的指針
  • 作為指向數組第一個元素的指針

那么這是如何工作的呢? 好吧,讓我們從數組的定義開始,讓我們以通常在C ++中完成的方式定義一個指向數組的指針:

const int MAX = 3;
int *array;                           // (1)

int intArray[3] = {30 , 40 , 50};

array = intArray;                     // (2)
for (int h = 0 ; h < MAX ; h++)
{
  std::cout << array[h] << std::endl; // (3)
}

現在這里發生了什么?

在第(1)行,我們定義了一個指向名為array int的指針。 注意:不是專門指向int數組的指針,而是一個指向普通int的指針。

在第(2)行,我們將intArray分配給該指針。 現在intArray是一個數組,那么如何將其分配給指針? 好吧,這就是魔術:如果在右值上下文中(即在需要值的上下文中)使用數組,則編譯器實際上會提供指向第一個元素的指針。 也就是說,該行完全等於

array = &(intArray[0]);

現在在第(3)行中,我們訪問array[h] 也就是說,我們就像訪問數組一樣訪問指針。 那么這里發生了什么? 好了,指針被解釋為指向數組的第一個元素,並且訪問了該數組的元素h 實際發生的是編譯器將*(array + h) array[h]替換為array[h] 也就是說,它取消引用的指針是h int總比以后array

好那你的定義是什么

int (*array)[MAX];

做? 就像前面的聲明定義了一個指向int的指針一樣,它也定義了一個指向MAX int s數組的指針,即一個指向int[MAX]的指針。 和以前一樣,它可以指向三個int的單個數組,也可以指向此類數組的數組。

現在當你做了

array = &intArray;

您將其設置為指向單個數組intArray

現在在您的輸出行中寫道:

*(array[h])

那么這里發生了什么? 好吧,在括號中有array[h] ,也就是說,您已經在指針array上使用了數組下標運算符[] 因此,編譯器將在您的3個整數數組中訪問第3個整數的第h個數組。 現在,那里只有一個整數數組,因此,只要h > 0您就會越界。 絕對沒有辦法預測到那里的數字(您的程序也可能已經崩潰)。

但是,我們尚未完成:您的完整表達式為*(array[h]) ,因此您實際上取消了對array[h]的結果的引用。 但是array[h]的結果是3個int s的數組! 很好,解引用運算符期望一個指針 ,因此數組再次“衰減”到指向其第一個元素的指針,並且當然可以將其解引用,從而得到數組的第一個元素。 實際上,您可以等效地將*(array[h])編寫為array[h][0]

這也是這種類型的變量的用例:通常使用形式為以下形式的變量

int intArray[3][3] = {{30, 40, 50}, {300, 400, 500}, {3000, 4000, 5000}};

您將使用array = intArray初始化指針,然后循環輸出

30
300
3000

好的,但是如何只用三個值訪問intArray值呢? 好吧,為此,您必須首先取消引用指針才能到達數組, 然后訪問數組索引運算符:

std::cout << (*array)[h] << std::endl;

或者,您可以將其視為1×3數組的第一行(也是唯一行),並等效地寫入

std::cout << array[0][h] << std::endl;
int (*array)[MAX]  ;

此行將array聲明為指向MAX整數數組的指針。 因此,如果要使用array打印intArray ,可以執行以下操作

for (int h = 0; h < MAX; h++)
    {
        std::cout << (*array)[h] << std::endl;
    }

您應該使用(*array)[h] array是一個指向intArray的指針,您應該首先取消引用它。

由於有人認為array屬於數組類型,這是完全錯誤的。 你可以用程序驗證

#include <type_traits>
#include <iostream>
using namespace std;
int main() {
  cout << is_array<int*[3]>::value << endl;
  cout << is_array<int(*)[3]>::value << endl;
  return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM