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