指標專場 這次一定啃透你哼

2021-07-10 08:36:39 字數 4336 閱讀 9823

1、在c中,對乙個指標加1的結果是對該指標【增加乙個儲存單元(storage unit)】,對於陣列而言,位址會增加到【下乙個元素的位址】,而不是下乙個位元組。

2、q:為什麼宣告指標時必須宣告它所指向的物件的型別?

注意,即使指標時指向標量的,也需要宣告指標型別,否則*pt操作不能正確返回數值。

3、關於指標定義的幾個tips:

(1)【指標的數值】就是它所【指向的物件的位址】。對於包含多個位元組的資料型別,比如double型別的變數,物件的位址通常指的是其【首位元組】的位址。

(2)在指標前運用運算子*就可以得到該指標【所指物件的數值】。

(3)對指標加1,等價於對【指標的值】加上它【指向的物件的位元組大小】。

4、陣列與指標間的關係:

首先理解兩個等式:

dates + 2 == &dates[2]; /*位址的比較,兩者相同*/

*(dates + 2) == dates[2]; /*值的比較,兩者相同*/

即總結下來就是:可以用指標標識陣列的每個元素,並得到每個元素的數值。

從本質上來說,對同乙個物件有兩種不同的符號表示方法,c語言標準在描述陣列時,確實借助了指標的概念。例如,定義ar[n]時,意思是*(ar+n),即「定址到記憶體中的ar,再移動n個單位,再取出數值。」

5、區分*(dates + 2) 和*dates + 2。

【間接運算子*的優先順序高於+】,故*dates + 2等價於(*dates) + 2。則兩者的意義分別為:

*(dates + 2) /*dates[2],即dates第三個元素的值*

/*dates + 2 /dates[0]+2,即dates第乙個元素的值加2的和*

/6、宣告陣列參量

由於陣列名就是陣列首元素的位址,所以如果【實際引數是乙個陣列名】,那麼形式參量必須是與之相匹配的指標。注意以下四種原型都是等價的:

int sum(int *ar, int n);

int sum(int ar, int n);

int sum(int *, int n);

int sum(int , int );

/*c中原型允許省略名稱*/

7、向函式傳遞陣列資訊的另一種方法

傳遞兩個引數:第乙個引數指明陣列的起始位址,第二個引數指明陣列的結束位址。如:

int sum(int *start, int *end);

在遍歷陣列中的每個元素時,可以直接修改指標本身,使指標依次指向各個陣列元素,這利用了指標引數是變數的事實。如:

while(start < end)
因為這是乙個對於不相等關係的判斷,所以end實際指向的位置是在陣列的最後乙個元素之後。c保證在為陣列分配儲存空間時,指向陣列之後的第乙個位置的指標也是合法的。請注意使用這種越界指標可是函式呼叫的形式更簡潔

ans = sum(arr, arr+size);

而上面的迴圈體也可精簡為一行**:

total += *start++;

【一元運算子*和++具有相等的優先順序】,但它在結合時是【從右向左】進行的。這意味著++應用於start而不是(*start)。也就是說,是指標自增1,而不是指標指向的資料自增1。上述**表示先把指標指向的資料加到total上,然後指標再自增1。(注意,儘管這樣表示正確,但為清晰起見,應該使用*(start++))

若**改為total += *++start; 則順序變為指標先自增1,然後再使用新位址其指向的值加到total上。

若**為:

total += (*start)++; 則會使用start指向的資料,然後再使該資料自增1,而不是指標自增1。這樣指標的位址永遠不變,但其中的元素改變了。這樣會使程式陷入死迴圈。

8、指標操作(重要!)

。通常使用陣列名或位址運算子&來進行位址賦值。

int urn[5] = ;

int *ptr1, *ptr2;

ptr1 = urn; //把乙個位址賦給指標

ptr2 = &urn[2]; //把乙個位址賦給指標

上述**中,把陣列urn的起始位址賦給ptr1,該位址是編號0x0029feec的記憶體單元。變數ptr2得到的是陣列第三個也即urn[2]的位址。

注意:位址應該與指標型別相容,即,不能把乙個double型別的位址賦給乙個指向int的指標。 。

故*ptr1輸出為100,即儲存在位址0x0029feec中的值。 。

本例中,ptr1儲存在記憶體位址0x0029fee8中,該記憶體單元的內容是0x0029feec,即urn的位址。

④將乙個整數加給指標:可以用+運算子講乙個整數加給指標,或者把乙個指標加給乙個整數。

兩種情況下,這個【整數】都會和【指標所指位元組型別的位元組數】相乘,然後所得的結果會【加到初始位址】上。於是,ptr+4的結果等同於&urm[4]。

注意:如果相加的結果超出了初始指標所指向的陣列的範圍,那麼這個結果是【不確定】的,除非【超出陣列最後乙個元素的位址是確保有效】的。

⑤增加指標的值:可以通過一般的加法和增量運算子來增加乙個指標的值。

對指向某陣列元素額指標做增量運算,可以讓指標【指向】該陣列的下乙個元素。因此,ptr1++運算把ptr1加上數值4,使ptr1指向urn[1],現在ptr1的值是0x0029feec(urn[1]元素的位址),*ptr1的數值為200(urn[1]的值),注意:ptr1本身的位址仍是0x0029fee8。變數不會因為它儲存的值的變化而移動位置。

⑥從指標中減去乙個整數:可以用-運算子從乙個指標中減去乙個整數。指標必須是第乙個運算元,或者是乙個指向整數的指標。

⑦減小指標的值:指標當然也可以做減量運算。

⑧求差值:可以求兩個指標間的差值。

通常對分別指向同乙個陣列內兩個元素的指標求差值,以求出元素之間的距離。差值的單位是相應型別的大小。如本例中,ptr2-ptr1的值是2,表示【指標所指向物件之間的距離為2個int數值大小】,而不是兩個位元組。

有效指標差值運算的前提是參加運算的兩個指標是指向同乙個陣列,指向兩個不同陣列的指標之間的差值運算可能會得到乙個數值結果,但也可能導致乙個執行時錯誤。

⑨可以使用關係運算子來比較兩個指標的值,前提是兩個指標具有相同的型別。

9、特別注意:看這裡看這裡~

你自己覺得行,你就一定行

今天在惠州市財政局三樓召開了 惠州市維穩綜治資訊管理系統培訓班 參加培訓的有市委政法委 市直單位 包括公安局 信訪局 司法局和勞動保障局 及各縣 區的領導和相關的基層工作人員,參加人數共一百二十人左右。很榮幸我可以參與並擔任講師這一角色,會議的議程是這樣的 1 領導講話 2 vpn的安裝講解 3 惠...

你一定聽說過「數獨」遊戲

第五屆校賽第6題 你一定聽說過 數獨 遊戲。如 圖1.png 玩家需要根據9 9盤面上的已知數字,推理出所有剩餘空格的數字,並滿足每一行 每一列 每乙個同色九宮內的數字均含1 9,不重複。數獨的答案都是唯一的,所以,多個解也稱為無解。本圖的數字據說是芬蘭數學家花了3個月的時間設計出來的較難的題目。但...

你一定很好奇! RPA是什麼

rpa robotic process automation 機械人流程自動化 可以看出rpa是由這三個單詞簡化而來的,那麼首先第一步,我們不妨從這裡開始。術語有有三個 機械人,過程和自動化。讓我逐一向您解釋這些術語。機械人 模仿人類行為的實體稱為機械人。流程 由機械人完成的任何過程,無需人為干預。...