C++語言中陣列指標和指標陣列徹底分析(系列一) (轉)
近來在論壇中機場經常看到有關陣列指標和指標陣列的討論。這個是學習c++等語言中不可少的步驟,
不過向來指標的東西就是很有用但是也是很難用的東西,所以學習起來也不是很容易了。近來本人也
沒有什麼專案可以做的,所以就隨便寫的自己關於這些方面的理解,供同行參考,同時也可以把自己
的錯誤理解暴露在陽光下,接受大家評判的洗禮。
By ZosaTapo
">file://dertyang@263.net
################################
# #
# 基本知識 #
# #
################################
當然我們一切都是從最簡單的內建型別開始,最後我會做一些推廣。
先看一下基本的形式,我們從這裡起步!
--------------指標----------------
int a=10;
int *p=&a;
-------------指標的指標-----------
int b=20;
int *p=&b;
int **p2p=&p;
-------------簡單陣列-----------------
int c[10];//整數陣列,含有10個整數元素
就是說每一個元素都是整數
--------------指標陣列--------------------
int *p[10];//指標陣列,含有10個指標元素
就是說每一個元素都是指標
--------------陣列指標--------------------
int (*p)[10];//陣列指標,這個指標可以用來指向
有10個元素的整數陣列
上面這些簡單的形式是我們必須要首先理解,這個是基本的知識。
同時我們從上面也要得出一個很重要的知識提示:c++語言層面上
關於變數宣告的部分,字尾結合變數的優先順序比字首要高的。
看我們上面的例子的最後兩個就明白了,我們為了實現陣列指標的
宣告我們不得不變通一下。我們採用()來實現優先順序的改變,實現了
陣列指標的宣告。
################################
# #
# 進一步提高知識 #
# #
################################
陣列,陣列的指標,指標的陣列,概念太多了。我接受概念一多的
時候,我就想把這些複雜的東西簡單一下。因為我太懶了,概念簡化
一下,記住更容易一點。所以我們這裡要認識一下上面這些概念本質。
這樣可以簡化概念,減少記憶的難度。
先看一段。
#include
#include
using namespace std;
int main()
{
int vInt=10;
int arr[2]={10,20};
int *p=&vInt;
int **p2p=&p;
int *parr[2]={&vInt,&vInt};
int (*p2arr)[2]=&arr;
cout< cout< cout< cout< cout< cout<
return 0;
}
執行的結果如下:(我在前面加了行號#XX)
#01 Declaration [int vInt=10] type==int
#02 Declaration [arr[2]={10,20}] type==int *
#03 Declaration [int *p=&vInt] type==int *
#04 Declaration [int **p2p=&p] type==int * *
#05 Declaration [int *parr[2]={&vInt,&vInt}] type==int **
#06 Declaration [int (*p2arr)[2]=&arr] type==int (*)[2]
現在我們來分析一下結果。因為我們已經具有了第一部分的基本知識,我們現在
可以很明確區別出來我們宣告的型別。這裡主要有兩個很重要的部分,我們不過
是就事講事情,是如何實現的原理不在這裡討論之列。
--------#02:陣列------------
現在看#02,想到了什麼沒有呀?在編譯器看來陣列只是相對應型別的指標型別。
當我們把陣列傳遞給作為引數的時候,傳遞的是指標,所以我們可以利用
引數來修改陣列元素。這個轉化是編譯器自動完成的。
void f(int[]);
int a[2]={10,20};
f(a);//這行等價於編譯器完成的函式轉化f(int *p)
也就是說這裡編譯器自動完成了int[]型別到int *的轉化,
注意是編譯器完成的,也可以說是語言本身實現的,我們
對此只有接受的份了。
-------#05:指標陣列---------------
指標陣列的編譯器內部表示也是對應型別的指標。
------#06:陣列指標----------------
陣列指標的編譯器內部表示就是有一點特別了。
編譯器(或者說是語言本身)有陣列指標這個內部表示。
由於c++語言的型別嚴格檢查的語言(當然還有一些是存在隱式型別轉化的)
所以我們下面的寫法是不能編譯透過的。
{
譯不能透過--------------
int arr[3]={10,20};//注意是3個元素陣列
int (*p2arr)[2]=&arr;//注意是指向2個元素陣列的指標
譯不能透過--------------
}
################################
# #
# 初步小結 #
# #
################################
透過上面兩個小節的內容,大家應該基本明白了,
陣列,指標,指標陣列,陣列指標到底是怎麼一回事情了吧。
-----------補充開始-----------------------
關於陣列和指標的轉化,以及我們使用指標(++,--)等來運算元組,
是基於陣列在中是連續分佈的。
但是我們使用“迭代器”的時候,情況是不一樣的。
這個問題本文不討論。
-----------補充結束---------------------
不過c++語言本身有很多詭異的地方(因為c++要考慮到跟c語言以及舊的c++版本相容)。
內建型別的這些性質特徵到了函式部分會有一點小的變化,不過如果你瞭解了編譯器做了
什麼以後的話,你也就不會太奇怪了。不過關於函式部分的內容我下次再說了。
現在回到上面的內容。我們這裡還是講一下內建型別。顯然一樣型別的變數是可以互相賦值。
不過當然還有一些其他情況也是可以的,比如型別的寬化,關於類的繼承體系問題等等。
當然了,不一樣的型別一般來說是不能互相賦值,當然這裡的例外就是強制轉化,
類的繼承體系等情況了。
看到這裡就會明白下面的程式為什麼會執行的了。
我這裡也把下面的程式作為今天內容的總結:
#include
using namespace std;
int main()
{
int a[2]={10,20};
int *p=a;//根據上面說明,由於編譯器的參與,兩者型別轉化後一致
int vInt=10;
int *parr[2]={&vInt,&vInt};
int **p2p=parr;//上面分析,型別一致
return 0;
}
-------------函式指標部分下回再寫了--------------------
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992833/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 陣列指標,指標陣列陣列指標
- 指標陣列和陣列指標與二維陣列指標陣列
- 指標陣列與陣列指標指標陣列
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- Go 陣列指標(指向陣列的指標)Go陣列指標
- Golang 學習——陣列指標和指標陣列的區別Golang陣列指標
- 陣列指標陣列指標
- C陣列和指標陣列指標
- C語言 指標與陣列C語言指標陣列
- 【C】 28_指標和陣列分析(上)指標陣列
- 【C進階】28、指標和陣列分析指標陣列
- c語言-運算子,陣列,指標C語言陣列指標
- C語言指標和陣列筆試題C語言指標陣列筆試
- 二維陣列與指標陣列指標
- 透過指標引用陣列指標陣列
- 【原創】淺談指標(十三)指向陣列的指標指標陣列
- 日常學習儲存--陣列和指標陣列指標
- 指標陣列練習排列字串指標陣列字串
- C指標和陣列的關係詳解指標陣列
- (C語言)使用指標列印陣列的內容C語言指標陣列
- 二維陣列的指標的理解陣列指標
- c程式設計--指標與陣列C程式程式設計指標陣列
- 陣列,函式與指標 詳解陣列函式指標
- 【原創】淺談指標(九)二維陣列和多級指標相關指標陣列
- C語言系列之 指標與陣列總複習視訊教程C語言指標陣列
- 要點1:指標、陣列和複合字面量指標陣列
- C++語言程式設計筆記 - 第6章 - 陣列、指標與字串C++程式設計筆記陣列指標字串
- 雙指標查詢陣列的連續規律子陣列問題指標陣列
- C----陣列越界問題、指標入門陣列指標
- 關於二維陣列指標的問題陣列指標
- sizeof和strlen計算陣列型別和指標型別字串陣列型別指標字串
- LeetCode合併兩個有序陣列(逆向雙指標)LeetCode陣列指標
- 3-6指標與陣列的天生姻緣指標陣列
- hdu 1277 AC自動機入門(指標版和陣列版)指標陣列
- 【C++系列】指標物件和物件指標的區別C++指標物件
- C語言使用指標對陣列指定位置進行插入元素C語言指標陣列
- 物聯網學習教程— 多維陣列與指標陣列指標
- 資料結構與演算法基礎之指標和陣列資料結構演算法指標陣列
- 力扣之反轉字串之原地修改輸入陣列(雙指標方式)力扣字串陣列指標