[英]'=': 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]
請記住, ptr
和x
都可以存儲地址。 希望這有助於澄清。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.