變數 記憶體 指標 二

2021-06-22 03:27:16 字數 1086 閱讀 7555

測試用**:

int    li_array[5]  =  ;

int   * p  =  li_array;

cout<<*p+1<<","<<*(p+1)<

cout<< (p+2)[1]

<

(p+2)[1] 寫法有些不正常, 但是合法, 正常情況下會寫成 *(p+3) 或是 p[3]

結論1:  [ ] 是個與*類似的「按位址訪問資料」的運算子

1. 在c++中, 按位址訪問(寫讀)記憶體中資料有兩種方法: ① * (位址+偏移量) ② 位址[偏移量]

例1   * (p+0)  //通常簡寫為 * p

例2   p[0]

例3   (p+1)[0]  //p+1先計算, 這是個位址偏移運算, 按int型別進行一次偏移, 得到乙個新的位址

//再計算[0], 這是按位址訪問資料運算, 先偏移0個位元組, 最後返回偏移後新位址中的int型資料 

所以這種寫法也可以:

int a=1;

cout<< (&a)[0];  //正常寫法是 cout<

2. 對應的, 獲得資料的位址也有兩個辦法 ① &變數名 ② 把陣列變數後的去掉

宣告指標的兩個辦法① int * p;  ② int a;      //p是指標變數, a是指標常量

3.&變數名是個指標常量, 所以不能 (&變數名)

++; 同理陣列名也是指標常量, 不能陣列名++

結論2:

1.所謂"陣列", 是用來在一片連續的記憶體中儲存一些資料(每個資料占用的位元組數相同)。

int   li_array[5]  =  ;  //申請了20個位元組的記憶體, 每個元素佔4個位元組。

//賦值前,這20個位元組中的很可能會有上次被使用時所「遺留」的資料

//同時, 本次使用結束(程式退出)後, 也會把資料「遺留」在這20個位元組中

2.陣列名(li_array)是乙個指標常量, 儲存的是分配給「陣列」的那20個位元組的記憶體的首位元組位址

3.這個指標常量的基型別, 就是"陣列元素"的資料型別

cout<< * (li_array+0)<<","<<*(li_array+1);    //輸出1,3

指標變數記憶體

1 指標不同於一般變數,存的是變數的位址,在同一架構下位址長度都是相同的 cpu的最大定址記憶體空間 所以不同型別的指標長度都一樣 你輸出的4 4 4,說明指標長度為4位元組 可以記錄的位址範圍是0x00000000 0xffffffff,這個範圍才是指標變數的值 比如說乙個char 1位元組,可以...

變數 記憶體 指標

變數 記憶體 指標 1 乙個變數需要使用一段連續的記憶體存放,記憶體中的二進位制數,就是變數值。相同的二進位制數,根據變數資料型別,表現為不同的變數值 2 可以宣告乙個變數代表這段記憶體,對這個變數賦值就是對這段記憶體寫入資料,在表示式中使用這個變數就是從記憶體中讀取資料 或者說 乙個變數就是特定的...

指標變數所佔記憶體

應該說這是乙個非常基礎的問題,教科書上說指標大小和機器字長相同,即32位機指標長度為4位元組!但是對不對呢?為什麼是這樣?搜了一下相關資料。居然發現回答不統一,很多人也同樣是糊里糊塗。字長 在同一時間中處理二進位制數的位數叫字長。通常稱處理字長為8位資料的cpu叫8位cpu,32位cpu就是在同一時...