1. 程式人生 > >兩個指標之間的運算

兩個指標之間的運算

只有指向同一陣列的倆個指標變數之間才可以進行計算。否則是沒有意義的。

兩指標變數相減

兩指標變數相減所得之差是倆個指標所指陣列之間相差的元素個數。實際上是倆個指標值(地址)相減之差再除以該陣列元素的長度(位元組數) 
注意:因為倆個指標相加沒有任何意義,所以別亂搞。

int* pf1, *pf2; 
int arr[10] = {0}; 
pf1 = arr; 
pf2 = arr+1; 
auto result = pf2 - pf1;
 
計算機具體運算是兩個地址值相減。應該是過載了運算子“-”,結果是指標值相減除以指標所指物件的大小。因為單純的地址值相減就會和指標所指的物件有關係,所指物件不同那麼它的偏移量就會不同。比如,所指的是字元型相減就是1,如果是雙精度型那麼就是是8。然而如果過載了之後指標相減了就僅僅是為了表示指標所指元素的距離。再說一遍這只是在連續的記憶體塊中才有意義(陣列)。那麼接下來這行程式碼就有意思了。

auto result = (char*)pf2 - (char*)pf1; 
這行程式碼得出的結果是4,沒錯你沒有看錯。最後的結果就是4。因為過載的運算機制如下:

那麼偏移量怎麼計算呢?就是兩個指標的實際的差值。如果你通過強制轉換成字元型(char)那麼分母的大小就是1而不是4,這樣的話就是擴大了四倍。最後就是得出結果就是元素的距離乘以擴大的倍數。最終得出的結果就是4。 

指標相減是指兩個指標值(地址)相減之差再除以該陣列元素的長度(位元組數)的意思了吧!上次回答:得到 (指標尾 - 指標頭)/ sizeof(陣列的型別) = 中間有幾個元素;
但是 / sizeof(型別) 編譯器已經幫我們實現好了.所以就無需我們做這一步

請教一下,這個的結果是什麼?關於兩個指標相減的問題
p1=(int *)ox0500;
p2=(int *)ox0518;
value=p2-p1;
printf(“%d”,value)

p1=(int *)ox0500;
p2=(int *)ox0518; 這兩句是吧 0x0500和0x0518這兩個16進位制數強制的作為Int型變數的地址。兩個Int型變數的地址之差就是這兩個地址中間可以有多少個int型變數。(這是因為C語言可以根據變數的型別來決定地址增加的實際空間。比如你定義一個int指標int *p,p=p+1時,其實在記憶體地址中實際加4,因為int在C中4個位元組。)
0x0518-0x0500=24  24/4=6  所以結果應該為6 即兩個地址之間可以有6個int變數的空間。

兩指標變數進行關係運算

指向同一陣列的倆個指標變數進行運算可以表示它們所指陣列元素之間的關係,比如:

  • pf1 == pf2 表示指向同一元素。
  • pf1 > pf2 表示pf1處在高地址位置。
  • pf1 < pf2 表示pf1 處在低地址位置。

相關推薦

指標之間運算

只有指向同一陣列的倆個指標變數之間才可以進行計算。否則是沒有意義的。 兩指標變數相減 兩指標變數相減所得之差是倆個指標所指陣列之間相差的元素個數。實際上是倆個指標值(地址)相減之差再除以該陣列元素的長度(位元組數)  注意:因為倆個指標相加沒有任何意義,所以別亂搞。

8.3 確定日期之間的工作日數目

one int form cas date_add ediff mat interval bsp 問題:給定兩個日期,求它們之間(包括這兩個日期本身)有多少個”工作“日。select sum(case when date_format(

js實現獲取日期之間篩選出指定周日制的方法

js var start = "2017-5-25"; var end = "2017-6-5"; var startTime = new Date(start); var endTime = new Date(end) var timeArr = []; var weekDay = ["1","2

Android中Activity之間簡單通信

idg tin test ide button ima 接收 9.png set 在Android中,一個界面被稱為一個activity,在兩個界面之間通信,采用的是使用一個中間傳話者(即Intent類)的模式,而不是直接通信。 下面演示如何實現兩個activity之間的通

頁面之間的通信

null down 新建 fun () odi 同步 etl div拖動 今天要給大家說的是兩個不同頁面之間的通信,通過一個拖拽demo來模擬: 首先,寫好基礎的拖拽代碼: <script> window.onload=function(){ var oDiv

計算日期之間的天數差C++/java

new abs ear == 關於 ostream logs col 多少 1--Java 分析:調用java中Calendar類 int days(Date date1,Date date2){   Calendar cal = new Calendar.getInst

8.05 確定日期之間的秒、分、小時數

max rom diff all red 日期 date edi cas select datediff(ward_hd,allen_hd)*24 hr, datediff(ward_hd,allen_hd)*24*60 min,

shell數字的運算,一共三變量

color == man done ech 個數 否則 code ati #!/bin/bash #兩個數運算的簡單腳本 22 + 33 ,一共三個參數 echo $# #對獲取的參數以此判斷是否包含[a-zA-Z]的東西,如果包含就退出.因為數字相加不是數字就是加

計算數字之間的額偶數和

數字 ctype doctype || isnan tle res har 是否 <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></

獲取日期之間的所有日期列表

start.s () clas gpo arr lis imei rtti star public static List<Date> genDateList(Date beginDate,Date endDate){ List<Date> date

C#實體之間相同屬性的映射

per sta pos ping nbsp info != 相同 urn public static R Mapping<R, T>(T model) { R result = Activator.CreateIn

C++ 計算任意日期之間的天數

gpo start plain efault ediff include win sel put C++寫的一個計算兩個日期之間天數的小程序: [cpp] view plain copy #include <Windows.h>

計算min-max整數之間的隨機整數

oss val 嵌入 stat set 總數 floor prim ble /*------------------------------效率最低 功能:計算min-max兩個整數之間的隨機整數 作者: 日期:20180831 區別:在查詢中嵌入count(*)計算記錄

html之間進行傳值,如何進行?

element input () cat .html article 代碼 進行 tails function turnto(){ var getval=document.getElementById("text").value; turngetval=escape(ge

java 獲取日期之間的天數

public static String calcTwoDate(Date date ,Date date2){ Calendar calendar = Calendar.getInstance(); calendar.setTime(date);

Oracle中使sql求日期之間的所有日期

比如,兩個日期是2018-08-27和2018-08-30,要求27,28, 29,30這四天的日期,我們可以採用下面的SQL來求得: --oracle 求兩個日期之間的所有日期 SELECT TO_CHAR((TO_DATE(KSRQ, 'yyyy-MM-dd') + (ROWNU

error C2110: “+”: 不能新增指標

        VS2010 CString 很正常的操作,突然報出< error C2110: “+”: 不能新增兩個指標 >的錯誤,反覆查看了程式碼,沒發現任何問題,只能一點一點排除,費了較長的時間,終於發現了問題的所在,故記錄下來,

C#實踐問題:如何在LINQ to Entities 查詢中,計算日期之間相差的天數?

在LINQ to Entities 查詢中,使用常規日期格式轉換函式Convert.ToDateTime()以及日期比較函式TimeSpan.Subtract().Days,都很麻煩而且會出錯:LINQ to Entities不能識別方法。。。 那麼要想在LINQ to Entities 查詢中

c# 計算日期之間相差的天數

    策劃要求有每日任務,因為對時間不瞭解,所以查了一下資料,終於完成了要求,現把程式碼記錄在下面。 算不上轉載,更算不上原創的一點想法吧         public vo