簡體   English   中英

'=':無法從'int(*)[5]'轉換為'int *'

[英]'=': cannot convert from 'int (*)[5]' to 'int *'

#include <iostream>
using namespace std;
int main()
{
    int x[] = { 1 ,2 ,3 ,4 ,5 };
    int *ptr;
    ptr = &x;
    return 0;
}

編譯器告訴我'=':無法從'int(*)[5]'轉換為'int *'。 這是什么意思? 我不了解的部分是, ptr作為指針可以始終存儲x的地址,而x本身就是指向數組基礎元素的指針。

變量x的類型為int[5] 應用於此變量的&運算符是指向int[5]類型的對象的指針。

您可以通過以下方式想象有效的聲明

typedef int T[5];

T x = { 1, 2, 3, 4, 5 };
T *ptr = &x;

另一方面你可以寫

typedef int U;

U x[5] = { 1, 2, 3, 4, 5 };
U *ptr = x;

如您所見,T和U是不同的類型,因此T *U *也是不同的類型。 這些類型的對象的初始化方式有所不同。 類型T *對應於類型int ( * )[5]而類型U對應於類型int *

沒有從一種指針類型到另一種指針類型的隱式轉換。 因此,編譯器發出錯誤。

數組名稱是指向數組第一個元素的常量指針。 因此,變量x是指向&x[0]的指針,或者x是指向整數數組x第一個元素的地址的指針。

指針是存儲地址的變量。 由於數組名稱是一個指針,因此它存儲一個地址。 在這種情況下, x存儲第一個元素的地址,即x[0]的地址。

您正在將變量ptr聲明為指向整數類型變量的指針。 因此, ptr在初始化時還將存儲一個地址。

因此,您的賦值語句ptr = &x; 當您先前在x存儲x[0]的地址時,正在嘗試查找已經在此處指定的地址的“地址”。

由於編譯器無法找到“ x [0]的地址”的“地址”,因此會產生錯誤。

告訴編譯器您要將x[0]的地址存儲在變量ptr的正確方法是,簡單地告訴它以下ptr = x; 或者,換句話說, ptr是等於存儲在地址x ,並將其存儲在地址x實際上是的地址x[0]

請記住, ptrx都可以存儲地址。 希望這有助於澄清。

暫無
暫無

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

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