指標 陣列 位址

2021-04-03 00:49:05 字數 2070 閱讀 3352

指標跟位址概念的不同,指標是一種位址變數,通常也叫指標變數,統稱指標。而位址則是位址變數的值。

實際上,位址這個東西,本來就是一種基本資料型別,本應該在介紹整數、浮點、字元等基本型別的時候把位址顯式地放在一起討論,這樣在後面介紹指標與陣列的時候就能避免許多誤解。可惜不少教材或者根本沒有談及,或者就算提起這個型別也用了指標型別這個字眼。這就錯了,指標不是型別,真正的型別是位址,指標只是儲存位址這種資料型別的變數!打個比方,對於

int i=10;

10是整數,而i是儲存整數的變數,指標就好比這個i,位址就好比那個10。指標能夠進行加減法,原因並不是因為它是指標,加減法則不是屬於指標這種變數的,而是位址這種資料型別的本能,正是因為位址具有加減的能力,所以才使指標作為存放位址的變數能夠進行加減運算。這跟整數變數因為整數能夠進行加減乘除因而它也能進行加減乘除乙個道

那麼陣列名又應該如何理解呢?用來存放陣列的區域是一塊在棧中靜態分配的記憶體(非static),而陣列名是這塊記憶體的代表,它被定義為這塊記憶體的首位址。這就說明了陣列名是乙個位址,而且,還是乙個不可修改的常量,完整地說,就是乙個位址常量。陣列名跟列舉常量類似,都屬於符號常量。陣列名這個符號,就代表了那塊記憶體的首位址。注意了!不是陣列名這個符號的值是那塊記憶體的首位址,而是陣列名這個符號本身就代表了首位址這個位址值,它就是這個位址,這就是陣列名屬於符號常量的意義所在。由於陣列名是一種符號常量,因此它是乙個右值,而指標,作為變數,卻是乙個左值,乙個右值永遠都不會是左值,那麼,陣列名永遠都不會是指標!不管什麼話,只要說陣列名是乙個指標的,都是錯誤的!就象把剛才int i=10例子中的10說成是整數變數一樣,在最基本的立足點上就已經完錯了。

總之要牢牢記住,陣列名是乙個位址,乙個符號位址常量,不是乙個變數,更不是乙個作為變數的指標!

總之要牢牢記住,陣列名是乙個位址,乙個符號位址常量,不是乙個變數,更不是乙個作為變數的指標!

在陣列名並非指標這個問題上,通常會產生兩種疑問:

1。作為形參的陣列,不是會被轉換為指標嗎?

2。如果形參是乙個指標,陣列名可以作為實參傳遞給那個指標,難道不是說明了陣列名是乙個指標嗎?

首先,c語言之所以把作為形參的陣列看作指標,並非因為陣列名可以轉換為指標,而是因為當初ansi委員會制定標準的時候,從c程式的執行效率出發,不主張引數傳遞時複製整個陣列,而是傳遞陣列的首位址,由被調函式根據這個首位址處理陣列中的內容。那麼誰能承擔這種「轉換」呢?這個主體必須具有位址資料型別,同時應該是乙個變數,滿足這兩個條件的,非指標莫屬了。要注意的是,這種「轉換」只是一種邏輯看法上的轉換,實際當中並沒有發生這個過程,沒有任何陣列實體被轉換為指標實體。另一方面,大家不要被「轉換」這個字眼給蒙蔽了,轉換並不意味著相同,實際上,正是因為不相同才會有轉換,相同的話還轉來幹嗎?這好比現在社會上有不少人「變性」,乙個男人可以「轉換」為乙個女人,那是不是應該認為男人跟女人是相同的?這不是笑話麼。

第二,函式引數傳遞的過程,本質上是一種賦值過程。c89對函式呼叫是這樣規定的:函式呼叫由乙個字尾表示式(稱為函式標誌符,function designator)後跟由圓括號括起來的賦值表示式列表組成,在呼叫函式之前,函式的每個實際引數將被複製,所有的實際引數嚴格地按值傳遞。因此,形參實際上所期望得到的東西,並不是實參本身,而是實參的值或者實參所代表的值!舉個例來說,對於乙個函式宣告:

void fun(int i);

我們可以用乙個整數變數int n作實參來呼叫fun,就是fun(n);當然,也正如大家所熟悉的那樣,可以用乙個整數常量例如10來做實參,就是fun(10);那麼,按照第二個疑問的看法,由於形參是乙個整數變數,而10可以作為實參傳遞給i,豈不就說明10是乙個整數變數嗎?這顯然是謬誤。實際上,對於形參i來說,用來宣告i的型別說明符int,所起的作用是用來說明需要傳遞給i乙個整數,並非要求實參也是乙個整數變數,i真正所期望的,只是乙個整數,僅此而已,至於實參是什麼,跟i沒有任何關係,它才不管呢,只要能正確給i傳遞乙個整數就ok了。當形參是指標的時候,所發生的事情跟這個是相同的。指標形參並沒有要求實參也是乙個指標,它需要的是乙個位址,誰能給予它乙個位址?顯然指標、位址常量和符號位址常量都能滿足這個要求,而陣列名作為符號位址常量正是指標形參所需要的位址,這個過程就跟把乙個整數賦值給乙個整數變數一樣簡單!

在後面的章節中,筆者將嚴格地使用位址這一概念,該是位址時就用位址,該是指標時就用指標,以免象其它教材那樣給讀者乙個錯誤的暗示。

printf 指標位址 陣列指標和指標陣列

首先,理解一下陣列指標和指標陣列這兩個名詞 陣列的指標 是乙個指標,什麼樣的指標呢?指向陣列的指標。指標的陣列 是乙個陣列,什麼樣的陣列呢?裝著指標的陣列。然後,需要明確乙個優先順序順序 所以 p n 根據優先順序,先看括號內,則p是乙個指標,這個指標指向乙個一維陣列,陣列長度為n,這是 陣列的指標...

關於陣列位址,指標

1.以下三條輸出語句分別輸出什麼?char str1 abc char str2 abc const char str3 abc const char str4 abc const char str5 abc const char str6 abc cout boolalpha str1 str2 ...

陣列指標和陣列首位址

下面 會輸出什麼 1 2 3 4 5 6 intmain intargc,char argv int ptr int a 1 printf d ptr 1 答案 4 解析 這邊主要考察的是陣列指標和陣列首位址的問題。a是陣列指標,a是陣列首位址。而指標的 1,增加的是1個指標型別的長度。比如 a是陣...