摘要:簡稱指針數組,是數組,因為沒有發生變化。就是這個指針,指向了,因為所以沒有被吸附到成為,而是留給了,讓成為了一個指針,脫離了數組名這個地址常量的范疇,也就是指向了一個個元素的整型數組的指針,簡稱數組指針。
這篇文章僅限于有指針基礎,并且大概了解這些概念,只是不通透的群體
首先了解一個概念:
類型名,顯而易見,類型名就是變量的名字,這里提前進行說明,數組名不是變量,也不是指針,而是地址常量,這是使用的時候系統會將其退化成指針。為了方便理解和統一,我們在本篇文章里面將數組名當做類型名類似物,但是切記。數組名不是類型名!然后,去掉變量的名字就是類型名!我已經解釋過了把數組名當做類型名類似的東西了。
這里我們列舉一些類型名:
int?a;---------?int是變量a的類型名
int?a[10];------------int是數組a每個元素的類型,此時這個int不是類型名,是每個元素的類型那么int [10]是數組a的類型(我們可以這樣來看,盡管在各種書上沒有這樣講的,但是這樣確實可以方便我們的理解)
int* a------------int*是a的類型,其中我們細分一下*在定義的時候代表是指針,而int代表的是指針指向的是int類型的數據哦。那么int*就是指向int類型的指針。
我們寫的是int*?a,不是int *a,雖然兩者是無所謂的,但是我會在后面講解我的理解,這里請記住這個*是緊跟在int后面,這樣會極大的便利我們的理解
int*?a[3]-------------這里的意思是數組a每一個元素的類型是int*,就像我上一個寫的int"*?a是一個道理。,那么此時類似我們寫的int?a[10],這個類型名int* [10]的意思就是包含10個int*類型的數組。是整個數組的類姓名,不是數組每個元素的類型名。簡稱指針數組,是數組,因為a沒有發生變化。
int (*)a[10]------------到這里我們就要進行深入了解了,紫色字體表示是插曲,看完插曲其他的內容連著上面說的來
查看優先級可以得到[]的優先級比*更高,所以導致int*?a[10]和int (*a)[10]是不同的,由于[]優先級比*高,所以a[10]是首先得到的,也就是先得到了一個數組,然后類型是int*,存放指針的數組,簡稱指針數組。那么打()就可以避免先結合的問題,直接表明了a是一個指針名,不是數組名了,也可以這么說,你的*要打在int的緊跟著的后面是為了強調*會被吸到int這邊,形成int*類型,(但其實是無所謂的!這么打都可以)如果被int吸附成int*,就代表這個變量里面存放的是int*,不然就還是int。而類型是int*類型的變量就是指針變量。我知道這里有的人會有爭議,有的人會說沒有這種說法,不嚴謹,但是我們只是為了應用,便于理解,所以這里就不爭端這個問題了。打上括號有2個原因:1.不被int吸附形成int*類型? 2.不被a吸附直接形成數組。好了接下來回到上面的,回到黑體字部分。
int(*a)[10]就是a這個指針,指向了int [10],因為()所以*沒有被吸附到int成為int*,而是留給了a,讓a成為了一個指針,脫離了數組名這個地址常量的范疇,int(*)[10]也就是指向了一個10個元素的整型數組的指針,簡稱數組指針。是指針。因為a發生變化了,我們可以看到(*a),a現在是指針類型。
接下來上圖:
?現在看我如何利用這一套理論秒殺!
int*(*a)[10]---第一部,去掉“變量名”,得到類型名,int*(*)[10],第二部:有一個*被吸附到int了,所以每一個變量里存放的是int*,然后再看,[10]說明有10個int*,再看(*),這是一個指針了,()讓其沒有被任何人吸附,再聯系上面講述的幾種基本的名稱,這個指針指向了一個存放了10個int*的數組。
int** (*a)[10],一樣的,指針指向了一個存放了10個int**的數組。那么我們成功引出了二維指針的引子。
所以我們要補充以上的理論了,之前說沒有括號*就會被吸附到int成為int*,沒有括號,a[10]的a是地址常量,有括號int (*a)[10],不僅防止了int*,也讓a沒有和數組結合,而是被*形成了指針,形成了數組指針。(數組指針就是指向數組的指針)。所以這個括號“防”了兩邊。
但是如果有兩顆**,那么只有前面的一顆會被吸附,剩下一顆讓a變成指針變量。int* *a,我中間空格了,int*是變量存的類型,如果加上[10]的話只不過是這個存放類型的堆疊而已。但是沒有[10]就是每個變量存儲的類型,加上[10]才是變量名哦。
指針的維數看*的個數,假設n維指針,那么前n-1個被int吸附,剩下一個被a吸附,形成指針,也就是a這個指針里面存放是int***(n-1個*),然后這int***(n-1個*)就是指它存放了一個指針的地址的地址的地址(n-1個的地址)。
int******(*a[10])[100]:第一部:去掉“變量名(再次提醒我們這里的變量名是變量名類似的東西,說明白了就是把數組名當初變量名,但它不是)”得到int******(*[10])[100],每個元素存放了int******,加上[10]就是變量的堆疊,也就是存放了100個int******的數組。括號里面是*[10],沒有(),所以被數組吸附了,是指針數組,代表這個數組存放了10個指針類型(把括號當初一個整體,再一層一層看),而這個類型是int******[100],也就是一個有10個元素的指針數組,每個元素都指向了一個存放了100個int******的數組指針。
看到*a[]想到指針數組
看到(*a)[]想到數組指針
int******(**a[10])[100],這個寫法明顯錯啦,我們說過n維指針前面n-1個*會被吸附到int,所以必定不會出現(**a[10])的情況,也就是括號里面就一個*,代表它是一個指針,就可以了。其實也不會遇到這么復雜的。
下一篇文章繼續深入探究,帶你走進不一樣的視角。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/124508.html
摘要:在位機器上,如果有個地址線,那一個指針變量的大小是個字節,才能存放一個地址。就是一個指針變量,也有自己的類型,指針變量的類型我們可以發現指針的定義方式是類型星號。也就是說存儲什么變量類型就用什么指針變量類型。 ...
摘要:需要注意的是用矩陣形式如行列表示二維數組,是邏輯上的概念,能形象地表示出行列關系。再次強調二維數組名如是指向行的。一維數組名如是指向列元素的。 哈嘍!這里是一只派大鑫,不是派大星。本著基礎不牢,地動山搖的學習態度,從基礎的C語言語法講到算法再到更高級的語法及框架的學習。更好地讓同樣熱愛編...
目錄 前言 一、 什么是指針? 引例 計算機是怎么對內存單元編號的呢? 內存空間的地址如何得到 想存地址怎么辦? ? 本質目的不是為了存地址 ?二、指針和指針類型 為什么有不同類型的指針 1.指針的解引用 2.指針+-整數 三、野指針 造成野指針的原因 1.未主動初始化指針 ?2.指針越界訪問 3.指針指向的空間釋放 規避野指針 四、指針運算 1.指針+-整數 ?2.指針-指針 ?3.指針的關系運...
摘要:如果我們要將的地址保存到中,我們需要我們給指針變量相應的類型。類型的指針是為了存放類型變量的地址這里可以看到,指針的定義方式是類型名指針變量名。如下最后本文介紹的是指針的基礎知識,往后還會繼續深入講解指 ...
摘要:所以是數組指針,而是指針數組。因為對一個二維數組,可以不知道有多少行,但是必須知道一行多少元素。當二維數組數組名傳參,形參接收時,數組的行可以省略,列不能省略,如果省略了列,我們就無法知道當指針加減跳過幾個字節。 ...
閱讀 663·2023-04-26 02:03
閱讀 1037·2021-11-23 09:51
閱讀 1110·2021-10-14 09:42
閱讀 1737·2021-09-13 10:23
閱讀 927·2021-08-27 13:12
閱讀 839·2019-08-30 11:21
閱讀 1000·2019-08-30 11:14
閱讀 1041·2019-08-30 11:09