在c語言中,陣列和指標是等價的嗎?

時間 2021-05-06 08:48:03

1樓:ga6840

有些地方一樣,有些地方不一樣。所以不等價

讀內容的話 a[5] 和 *(a + 5) 和 *(5 + a)甚至和 5[a]都是等價的。

有人認為陣列在編譯時自帶維度資訊,通過型別檢查可以幫助檢查越界。這一點比較勉強,畢竟 b[2][3][4] 中的 b 其實也可以被稱作指標,也就是 (*b)[3][4] 。在 C 語言裡,指標其實也可以攜帶維度的型別資訊。

真正不一樣的地方,是在定義陣列的時候,其本身的位址就是他符號 (identifier) 所代表的位址,比如

struct protocol ;

上面 body 的位址就是他結構體的位址加上他自己作為 member 的 offset。 也就是說此處陣列位址和結構體位址是連續的。

如果是定義指標的話:

struct protocol ;

雖然兩個 body 的型別都是 "char *",但是第二個 body 指向的位址不一定和結構體位址是連續的。

另外乙個不一樣的是,陣列定義以後他對應的符號是 const 的,也就是 int a[5] 中的 a 可以看成是 int * const a。(編輯注釋:這裡只是從賦值角度打的比喻,在其他地方這樣的比喻是不恰當的)

最後,陣列定義後可以用 sizeof 獲得他的維度,而指標的 sizeof 值永遠是 sizeof(uintptr_t),也就是目標環境下指標的大小。

2樓:乙隻樹

陣列和指標完全是不搭界的概念吧。。。陣列是一種資料組織的結構,指標是一種變數型別。唯一有點關係的地方就是,陣列的首元素位址就是指向陣列的指標值,這是有資料在記憶體種的順序存放造成的,首元素最方便。

3樓:

陣列可以理解成定義了乙個位址它自己, 值也是它自己的指標, 同時還分配了對應大小的記憶體

指標只是定義了乙個給定型別的指標, 分配的記憶體只是機器位寬

事實上...我感覺所有對陣列的操作都是按照指標方式來的, 比如經典的乙個例子

之所以能夠寫成1[a] 因為*(a+1)和*(1+a)是乙個意思啊...

而且編輯器對於函式形參中的陣列也是當作指標來處理的...

其實我一直覺得陣列就是個指標的語法糖

基本上 int a[5]; 和 int *a = malloc(sizeof(int)*5) 在使用上是等價的

區別是第二個指標還另外佔了乙個指標的空間, 以及sizeof()的時候不同

另外, 如果看一下彙編的話...這個sizeof其實還是編譯器塞進去的常數

當然, 非要說的話語義還是不同的

陣列的語義是陣列的指標的語義是指標的

但是說陣列是一種特殊的指標基本上是沒有太大毛病的

"陣列能隱式轉換成指標" 感覺這麼說也沒有問題

指標的值確定資料的基位址, 指標的型別確定運算元據的方法

結構體和整型除了分配的記憶體大小不一樣以外有啥本質區別麼...攤手

4樓:胖子許木木

指標的準確定義: 指向某個記憶體相同型別連續空間的起始位址。如果按照準確定義,指標和陣列就是等價的。舉個例子:

在int main(int argc, char** argv)中, argv配合著argc其實跟陣列就是等價的了,底層模型就是相同型別(型別是char*)連續記憶體空間(空間大小是argc)的陣列。

如果char** argv沒有argc地配合出現, 相當於argc = 1的預設情況了,說等價就是空間大小為1,說不定價也是對的。

5樓:左江

不等價關於為何不等價其他回答應該已經足夠詳盡不需贅言我想談談一些關於陣列和指標其他誤解

每次一說到陣列和指標總會有很多人喜歡扯上彙編說定址啊說本質啊這是乙個非常可笑的現象

int 和 double 定址上也是一樣所以int和double沒區別嗎? 荒唐滑稽

然後又有人說陣列本質是指標因為彙編層面怎麼樣怎麼樣喜歡談彙編那一起看看記憶體吧

int arr[10];

int* p;

假設int 是4個位元組 arr在記憶體裡面是一塊40個位元組的記憶體塊而p 在記憶體裡面只是一塊4個位元組的記憶體塊

談本質這才是真真正正的本質

在記憶體面前彙編怎麼樣怎麼樣都是渣渣陣列和指標就是不一樣@邊弨

6樓:Xi Yang

陣列和指標不管是語義上還是實現上都不等價。

陣列是用來就地宣告一段連續的儲存。它就在你寫它的地方,比如全域性區或者棧上。

指標是一種裸奔的引用語義。

這種疑惑體現了C的乙個設計問題:陣列型別是二等公民,你不得不在很多地方使用指標(及其增減運算)去訪問陣列。

7樓:

1.陣列可以理解為加了const修飾符的指標,但是與指標不同的是,指標要分配4位元組(32位)空間,陣列不分配額外空間,首元素就是"指標"的起始位址.

為了理解方便,

除了不能運算和賦值外,用法可以和指標一樣.

比如char arry="adsfsfs";

可以當右值進行解引用char ss=*(arry+1);

可以當左值間接修改陣列的值*(arry+1)='A';

可以理解為陣列名編譯後就是指標的首位址.

2.陣列做為函式引數,形參會退化為完全的指標變數進行使用.

c和pascal的編譯器都是這樣處理的.

3.初學者要注意的是,陣列,陣列型別,陣列指標,指標陣列是不同的4個概念.

你分得清這4個概念,就能完全理解陣列名的真實含義

8樓:張齊天

首先思考乙個問題。陣列的名字恰好可以表示為乙個位址(例如 int a[10] = ; int *p = a;),這樣 a 此時肯定是等於 &a[0] 的,即首位址。但如果我們反過來看:

如果我們單看這個指標變數(比如例子裡的 int *p),你怎麼知道這個指標 p 表示的是乙個陣列的首位址,還是指向了乙個普通變數(這個普通變數的位址)呢?

如果你覺得不好理解,可以先簡單認為陣列是C語言裡用指標這種機制所封裝好的一種特殊的型別;而正因為是封裝好的,所以陣列提供了乙個機制用來專門和指標進行互操作,這個機制就是,拿陣列名字直接表示乙個位址,表示這個陣列的首位址。而從這種說法就可以看出,指標用法更靈活,而陣列僅僅是乙個封裝機制,表示一組元素罷了。

而指標用來指向乙個東西:

(存放)指標(的)變數和(指向)變數(的)指標(這倆不必過於區分和區別它們);

(存放)指標(元素型別的)陣列和(指向)陣列(的)指標;

(返回)指標(型別的)函式和(指向)函式(的)指標;

乙個返回乙個指標的函式,它不需要引數。然後有乙個指標拿來指向這個破玩意兒,然後又有乙個陣列,專門存放這種指向函式的指標……

說的這些你都可以先不用了解(那說那麼多幹嘛),但你可以從這個體系化的對指標的簡要說明裡知道,陣列和指標的使用方向不同(陣列是用來存一系列資料的,指標則是用來指向各種東西的)。正因為它們的用途不同,所以我們才說,它們是不同的東西。

到你學到後面發現了函式指標的時候,你就會知道,其實函式名一樣也表示了這個函式的位址,我們可以借用指向函式的指標(函式指標)來控制這個指標具體指向(和執行)什麼函式……

9樓:「已登出」

指標指向乙個記憶體位址,訪問時使用的內容格式由指標的型別決定。

陣列是記憶體裡儲存一組格式相同的資料的一種資料結構。陣列的每個元素可以用&得到指向其記憶體位址的指標。另外陣列名字可以直接當作指向其第0個元素的記憶體位址的指標來使用。

10樓:暮無井見鈴

不等價,陣列能隱式轉換成指標罷了。看到有書這麼寫的話應該考慮直接扔掉。陣列和指標的區別應該是十分基礎而顯然的。

定義乙個指標物件 T *ptr; 後 ptr 這個物件裡面沒有 T 型別物件,不過可能可以通過 ptr 訪問存在於別處的 T 型別物件。

定義乙個陣列物件 T arr[N]; 後 arr 這個物件裡面有 N 個 T 型別物件。將 arr 隱式轉換成指標後,能訪問的 T 型別物件是 arr 裡面的物件。

11樓:心裡藏著小怪獸

陣列名是常量,指標是變數,常量與變數不等價。

陣列是連續的記憶體,陣列名是連續記憶體的門面,數值上為記憶體首位址。

指標是存放位址的變數,所以能儲存陣列的首位址,即把陣列名賦值給指標變數。

12樓:涇渭漳淮

不等價,陣列只是一種特殊的指標。

陣列只能指向棧空間(或靜態儲存區),指標可以指向任何堆疊空間。

陣列指向的空間裡存放的是若干相同型別的資料,指標指向的空間裡可以存任何資料。

13樓:yemaster

不等價陣列相當於乙個變數集

一般普通變數儲存的都是值,例如int a,你輸出a是a儲存的值。求位址需要用&。陣列可以直接變數名+下標來呼叫位址,但中括號還是呼叫的值與指標不同

而指標儲存的是記憶體位址,例如你定義乙個指標a輸出a是a的位址

C 語言中指標陣列和陣列指標 函式指標 指向函式的指標等等該怎麼理解?

ga6840 direct declarator IDENTIFIER declarator direct declarator direct declarator assignment expr direct declarator declarator direct declarator poin...

在 C 語言中指標的歷史是怎樣的?

Crazyjin 型別 變數和變數的值本來就是三個概念 一直都是三個概念。int是型別,int a 申明了乙個int型別的變數a。pointer是型別,pointer variable是pointer型別的變數。只不過這裡pointer和pointer variable沒有指明具體型別。這裡舉個具體...

在c語言中指標就是可以變化的位址嗎?

僅僅說對了一部分。1 的確,在絕大多數場合,指標是 變化的位址 我們開拓一下思路 變化的位址 的反義 是 不變化的位址 對嗎?沿這個思路,想一想,指標是否可能是 不變化的位址 int const p 指標p能變化嗎? 我認為,不一定 指標不僅負責儲存乙個位址,還負責儲存,它能管轄的記憶體範圍 例如 ...