陣列 指標及記憶體

2021-10-03 16:01:15 字數 2664 閱讀 3687

一、記憶體四區

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肯定是錯誤的,所以找個機會總結一...