想問問大佬們
陣列a的所有元素都是int型
那么a[1]和a[3]在記憶體中都占4個單元(位元組)
為什么a[3]的地址減a[1]的地址只相差2個單元
為什么不是2×4=8個單元


uj5u.com熱心網友回復:
因為你的p和q定義的是int *,你定義為void *試試,或者定義為byte *試下。uj5u.com熱心網友回復:
你反過來思考就明白了p = &a[1];
q = p + 2;
這時你覺得q指向陣列的哪個元素?是不是指向&a[3]?
也就是指標的加減編譯器會自動根據指標的型別來計算,這樣能讓用戶不用關注每種型別占用的位元組大小,只是單純的考慮移動幾個單元就可以了,否者用戶做指標加級訓要考慮每種型別占用的位元組(每個系統可能占用的位元組也不一樣),這樣會把編程復雜化,而且也不方便移植。
uj5u.com熱心網友回復:
指標減法是基于陣列的下標運算建立的,指向同一個陣列的不同元素的指標相減的結果等價于下標差。因而討論單個元素的大小等是無意義的(除非你要理解匯編)。uj5u.com熱心網友回復:
你如果想知道移動了多少個位元組,可以轉成int后再加減即 printf(“%d”, (int)q -(int)p);
uj5u.com熱心網友回復:
void* 不能相減uj5u.com熱心網友回復:
void *可以先轉為uint直接用uint相減,指標就是個地址的值有什么不能減的。
uj5u.com熱心網友回復:
void* 不能相減
因為你的p和q定義的是int *,你定義為void *試試,或者定義為byte *試下。
void *可以先轉為uint直接用uint相減,指標就是個地址的值有什么不能減的。
那是uint相減
void* 是一個地址的值
是一個很不嚴謹的說法 并且和討論的問題 沒有關系
C里面 減法運算對運算元的型別有規定
這些規定里面void* 這個型別不能相減
uj5u.com熱心網友回復:
這里指標的加減是以陣列中元素為單位進行加減的,而不是以字切為單位進行加減的。uj5u.com熱心網友回復:
你說得很清楚
void* 不能相減
因為你的p和q定義的是int *,你定義為void *試試,或者定義為byte *試下。
void *可以先轉為uint直接用uint相減,指標就是個地址的值有什么不能減的。
那是uint相減
void* 是一個地址的值
是一個很不嚴謹的說法 并且和討論的問題 沒有關系
C里面 減法運算對運算元的型別有規定
這些規定里面void* 這個型別不能相減
你嚴格按照規定操作沒有什么問題,void *這個定義實際應用中大部分場景就是為了方便傳遞各種型別指標的通用型別,實際應用中最后基本都強轉為了其它型別。習慣問題,我是隨心所欲型,知道自己在做什么就行。當然為你的嚴謹點贊,這個只是我的個人習慣。
uj5u.com熱心網友回復:
指標相減的結果是整數, 但是這個整數的意思,并不是差幾個BYTE, 而是差幾個指標指向的資料的型別printf指定%p型別輸你的指標地址,你就能看到,指標地址具體是多少了, 他們之間的差距就BYTE
uj5u.com熱心網友回復:
實際上 你和我的操作都是一樣的
轉換為uint 相減
或者轉換為 char* 相減
這里的回復主要是針對你回復中講的 型別定義為void* 相減
這對新手來說 有些誤導
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/148820.html
標籤:C語言
下一篇:一知半解
