一、記憶體四區
a) **區。存放**
b) 全域性區。全域性的常量、字串常量和變數
c) 棧區。 系統自動開闢,系統自動釋放,並不是很大。比如for迴圈中的int i = 0。
d) 堆區。動態開闢的記憶體,手動開闢,手動釋放。大。比如自己定義的資料結構
a) 編號連續
b)唯一的
c)取位址運算子 :&。單目運算子, 優先順序很高, 結合性從右往左
四、指標變數
1.用來存放位址的變數。 2.記憶體大小4b
int a = 5;
野指標:不能明確指向的指標變數。
int *p //p儲存的位址不確定,指向不明確.可能會操作到重要資料(並不想看見的)
最好定義為:
int *p = null;
*p = 100; 這步也是錯誤的,因為null就是0位址,計算機0-255是計算機內部私有記憶體位址
萬能指標:void *
int a =10;
void* p = &a //當不知道a的型別時,用void替代
*(int*)p = 100; //但是在重新賦值時候必須加上型別強制轉換,要不然不知道應該讀取多大記憶體空間存100
四、指標變數的運算
+, -, ++, -- 指標偏移,訪問位址旁邊的記憶體
p + 1
指標變數的加減,以指標所指向的型別空間為單位進行偏移。
五、一維陣列與指標
初始化
int a[2] = ;
int a[5] = ; //後面沒有初始化的元素預設為0
int a = ;//兩個元素
int a = {} ;//錯誤
在c++11中新加了列表初始化:
1、省略=: int a ;
2、大括號為空,所有元素置零。 int a[1] {};
c中陣列元素引數不能為變數,c++可以:
const int n = 3;
int a[n] ;
定義乙個一維陣列,陣列名是這個陣列的首位址,是乙個常量
定義int a[5]
,a指向a[0], a[0]是int元素,a的型別就是 int*,
但是&a
這個位址指向的是整個陣列, 它的型別是int(*)[5]
訪問陣列元素
下標法或者int *p = a;
a是陣列名,首位址。永遠是陣列名,不能通過自加減去訪問陣列元素。
六、二維陣列與指標
定義int a[3][4]
;
陣列名 a是二維陣列的首位址;
a指向二維陣列的第乙個儲存單元(一維陣列);&a
指向整個陣列,其型別是int(*)[3][4]
a是指向a[0]這個一維陣列;a的型別是int(*)[4]
;
a[0]
指向a[0][0]
; a[0]的型別是int *
;相當於陣列名
訪問 m行n列:
a[m][n];
*(a[m] + n);
*( *(a + m) + n);
#include using namespace std;
int main();
//cout<<*(a+1)<七、指標與const
通過一級指標改變const修飾的常量
const int a = 10;
int* p = &a;
*p = 100;
如果是const修飾的int*(指標型別),則不能改變指標變數指向的記憶體空間的值,但是可以改變指標指向的位址
int a = 10;
const int* p ;
p = &a;
//*p = 100;這句話報錯
int b =100;
p = &b; //沒問題
const修飾指標變數,可以改變指標變數指向位址的值,但不能改變指標指向的位址
int a= 10;
int b =100;
int* const p = &a;
*p = 100; //正確
p = &b; //錯誤
const 修飾指標型別,也修飾指標變數,那麼不能改變指標指向的位址,也不能改變指標指向的值
int a = 10;
const int* const p = &a;
指標 陣列及記憶體管理
我們先來了解一下c與c 的記憶體管理。常見的記憶體錯誤及其對策 發生記憶體錯誤是件非常麻煩的事情。編譯器不能自動發現這些錯誤,通常是在程式執行時才能捕捉到。而這些錯誤大多沒有明顯的症狀,時隱時現,增加了改錯的難度。有時使用者怒氣沖沖地把你找來,程式卻沒有發生任何問題,你一走,錯誤又發作了。常見的記憶...
陣列指標的記憶體布局及例項
首先測試源 如下 include int main void gcc wall p3add1.c p3add1.c in function main p3add1.c 6 18 warning initialization from incompatible pointer type enabled...
指標陣列 陣列指標的分配記憶體及函式引數 C語言版
最近寫 總是被基礎知識卡住,十分耽誤時間,今天又卡住了。所以下定決心一定要弄清楚這個問題,然後不好的是網上的資料總是解決的並不清楚,總是在糾結什麼是指標陣列什麼是陣列指標,看了 c缺陷和陷阱 也沒有我想要的東西。要麼就是c和c 混為一談,new int 5 這種語法c肯定是錯誤的,所以找個機會總結一...