區分指針加一和普通類型(如int 、char、double)加一
指針加一:指針加一包括普通指針(如int *...)、數組指針、結構體指針等等,對指針進行加1操作,得到的將是下一個元素的地址,一個類型為T(如int (*) [5]的數組指針類型)的指針移動,是以sizeof(T)為移動單位。
普通變量加一:普通變量加一其實就是數學上的加一操作。地址如果轉換成普通變量,需要注意該普通變量的類型的數值范圍是否可以容納下地址的數值大小而不發生數值丟失。
需要注意的是,當你把地址前置裝換成char類型是會出錯的,是因為char類型的內存空間(1字節)有限,也就是他的值得范圍是有限的,所以你把地址前置轉換成char后再轉成int *類型(或者其他指針類型)去解析,很有可能會出現段錯誤(應該是一定會出現段錯誤,因為對應char的數值范圍大小的內存區間是kernel用的地址空間,拒絕訪問)。
總結:指針移動的目的就是為了去訪問內存地址。而內存地址抽象出來的就是數字,我們進行指針訪問時,需要移動指針其實就是對內存地址的數值進行加減運算,使得我們的指針指向我們想要訪問數據的內存空間的頭位置處,然后在通過強制類型轉換(如果類型匹配,也可以不用強制類型轉換),用我們想要的解析方法去讀取該內存空間的數。
代碼演示:
#include<stdio.h> typedef struct test { int a; double b; char c; }Test; int main(void) { Test chen; chen.a = 5; chen.b = 19; chen.c = 'a'; //double *p1 = (double *)((char)&chen + 4);//這種強制類型轉換導致&chen的數值丟失了 double *p2 = (double *)((int)&chen + 4); //把&chen轉為普通的數值,需要+4后才指向下 //一個結構體元素,chen.b double *p3 = (double *)((char *)&chen + 4);//把&chen轉為char 類型的指針,加1,表示移 //動sizeof(char)個單位,所以要移
//動4個單位才可以指向chen.b double *p4 = (double *)((int *)&chen + 1); //把&chen轉為int 類型的指針,加1,表示
//移動sizeof(int)個單位,所以只需要移
//動1個單位就可以指向chen.b //printf("*p1 = %f.\n", *p1); //去訪問了不能訪問的地址空間,會發生段錯誤 printf("*p2 = %f.\n", *p2); printf("*p3 = %f.\n", *p3); printf("*p4 = %f.\n", *p4); return 0; }
打印的結果:
覺得對你有所幫助,請點贊!如果覺得有什么不懂也請留言詢問,我會及時回復的!