測試用**:
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就是在同一時...