【C語言】指標的算術運算(指標+/-整數、指標+/-指標)
文章推薦指數: 80 %
那問題就來了,是不是對指標的任何運算都是合法的呢? 答案是它可以執行某些運算,但並 非所有的運算都合法 。
(指標可以進行加減法,對於乘除 ...
程式人生>>【C語言】指標的算術運算(指標+/-整數、指標+/-指標)
【C語言】指標的算術運算(指標+/-整數、指標+/-指標)
阿新••發佈:2018-11-06
一、指標+/-整數
在之前學習指標時,我們知道指標其實也是一種特殊的變數,既然這樣,那麼指標應該和普通變數一樣,可以進行算術運算。
那問題就來了,是不是對指標的任何運算都是合法的呢?
答案是它可以執行某些運算,但並非所有的運算都合法。
(指標可以進行加減法,對於乘除法是非法的)
指標+/-整數是另一個指標,問題又來了:那它是怎樣加的呢?怎樣減的呢?
接下來介紹一個例項:
#include
接下來我們一起來分析一下指標加一到底表示什麼
猜想1.加一個數組
這種情況是無意義的。
使用指標的目的就是訪問陣列內的元素,若為加一個數組,則直接到陣列的後一個地址,並沒有訪問陣列內元素,所以這種情況可以排除。
猜想2.加一個位元組
就上述例子,我們定義了一個整形陣列arr,p指向陣列首地址。
假設其首地址為1000,每一個單元格佔4個位元組則整個陣列對應的地址如下:
圖1陣列arr對應的地址
*p=10,是將陣列首元素的值改為10:
圖2將陣列首元素的值改為10
我們把前兩個單元格用位元組的形式畫出。
十進位制的10轉化為十六進位制為0xa,arr[0]佔用4個位元組,也就是8位,即0x0000000a,同理我們可知十進位制的2轉化為十六進位制為0x00000002。
又由於電腦使用的小端儲存,即低地址存放小資料,如下圖所示:
圖3arr[0]、arr[1]位元組儲存
當p為加一個位元組時,將*p賦值為20,十六進位制為0x00000014,則如下圖4所示:
圖4假設p加一個位元組,賦值為20
此時arr[0]的值為0x140a,轉化為十進位制為5130。
arr[1]=0,顯然與我們想要的結果不符,所以這種情況也可以排除。
猜想3.加一個單元格
當p向後加一個單元格,即指向arr[1],則將arr[1]修改為20,如圖5所示:
圖5p向後移動一個單元格後賦值
將arr[0]和arr[1]轉化為十進位制分別為10,20,此時結果才是正確的。
說明對於整型指標p++,應為加一個單元格,也就是四個位元組。
進而可推廣指標+整數的表示含義,地址需要調整,調整的權重為sizeof(指標去掉一個*)
接下來通過一些例項驗證一下這個推論:
#include
2、指標-指標
只有當兩個指標都指向同一個陣列中的元素時,才允許從一個指標減去連一個指標。
兩個指標相減的結果型別是ptrdiff_t,它是一種有符號整數型別。
減法運算的值是兩個指標在記憶體中的距離(該距離以間隔的單元格數為單位,而不是以位元組為單位)。
演算法步驟:1、求出間隔的位元組數 2、將其除以調整的權重
例項演示:
#include
3/2的結...
彙編:實現C語言的||與&&運算
;C程式轉匯編(或運算連結)
DATASSEGMENT
aDw5
bdw6
ccdw7
ddw8
mdw2
ndw2
str...
C語言中的自增運算
main(){inti=5,j=5,p,q;p=(i++)+(i++)+(i++);q=(++j)+(++j)+(++...
C語言通過邏輯運算(與或非)實現加法
1.加法器:首先看看下面的內容,瞭解一下什麼是加法...
搜尋
基礎教學
Mysql入門
Sql入門
Android入門
Docker入門
Go語言入門
Ruby程式入門
Python入門
Python進階
Django入門
Python爬蟲入門
最近訪問
【C語言】指標的算術運算(指標+/-整數、指標+/-指標)
讓嵌入式工程師毛骨悚然的掉電丟資料事故可以這樣解決!
centos+7+ssh免密碼登入
JAVA反射改動常量,以及其局限
Android+Studio:基本UI介面設計+(詳細)
CE修改器使用教程+[提高篇]
BZOJ+3585&&3339+靜態區間mex【主席樹】
SQL語句刪除具有外來鍵約束(foreign+key)的表。
錯誤提醒:無法刪除物件+'表名',因為該物件正由一個+FOREIGN+KEY+約束引用。
bzoj+4327:JSOI2012+玄武密碼
Android開發之實現最簡單最酷炫的3D圖片瀏覽效果(二)
延伸文章資訊
- 1C++教學(十七):指標的運算 - 痞客邦
C++教學(十七):指標的運算. 除了指定運算子=、取址運算子&與取值運算子*之外,還有+、-、++、--、+=與-=等運算子可以使用在指標上,也就是說,您在 ...
- 2C語言: 超好懂的指標,初學者請進~ - 寫點科普Kopuchat
接下來還想問個問題:能不能利用pointer 去拿到它指向的b 這個變數呢?當然可以。這邊同樣要利用到* 這個運算符號。 當我們跑完這個程式碼之後: int b = ...
- 3指標的運算
除了指定運算子 = 、取址運算子 & 與取值運算子 * 之外, + 、 - 、 ++ 、 -- 、 += 與 -= 等運算子也可用在指標。 指標加法與減法與一般數值的加減不同,在指標運算上 ...
- 4指標
y = *p + 1; //透過p取某記憶體的值(現在是c)加1之後,把結果存入y中. ++*p; // 指標p所指 ... 指標裡的+運算符號,如pointer p + integer n,表...
- 5C語言筆記— 指標(Pointers)
C語言當初是被設計為低階的程式語言(比較接近電腦的思考方式),也正因為如此,我們可以輕鬆地進入程式的記憶體位置並執行和記憶體有關的運算等等。