C C 指標與陣列

2021-09-24 13:55:51 字數 3091 閱讀 7350

目錄

陣列記憶體位址

指標 + 偏移

指標加減法

指標變數遍歷陣列

// 取乙個變數的位址 &符號;

int a = 4; // &a取得變數a的記憶體位址;

// 陣列是一塊連續的記憶體,型別 名字[個數]

// sizeof(型別) * 個數,連續的記憶體;

// 區域性變數的陣列,所以這個陣列的記憶體是分配在我們的棧上的

// 連續的記憶體,由低位址排到高位址;

名字為這塊記憶體的首位址------>   名字 + offset,就可以確定元素的位址位置

陣列元素取位址------>   &名字[offset]

int b[3] = ;

陣列元素的記憶體位址,第2個元素的記憶體位址

(1)&(陣列名字[索引]),陣列的開始(首)位址,&陣列名字[0];

(2)陣列名字本身就是乙個位址,它是這個陣列的首位址;

int b[3]; b就是這個陣列的記憶體起始位址,b == &b[0];

(3)使用陣列名字+偏移offset,來獲取從陣列的首位址到offset這個元素的位址;

int b[3]; int offset = 2; b + offset 相當於 &b[offset], 陣列記憶體的首位址;

*/printf("0x%x, 0x%x\n", b, &b[0]);

int offset = 2;

printf("0x%x, 0x%x\n", b + offset, &b[offset]);

// 觀察一下 b, b + 2 --> 8個位元組 --> offset * sizeof(int);

// offset指的是陣列元素的個數,

// b + offset的數值大小其實是: b + sizeof(資料型別) * offset;

// offset不是指的位元組數,而是元素的個數;

// end

二維陣列的名字為二維陣列的首位址

a[y] 表示是第y行的位址

&a[i][j]------>   元素(i,j )的位址

//  二維陣列,

// 二維陣列其實也是一維陣列,它是資料元素一行一行的存到記憶體裡面的;

int s_array[3][3] = ,,,

};/*

(0)二維陣列每乙個元素來取位址;

(1)二維陣列的名字,就是二維陣列的首位址--> &s_array[0][0]

*/printf("***************\n");

printf("0x%x, 0x%x, 0x%x\n", s_array, &s_array[0][0], s_array[0]);

printf("0x%x, 0x%x\n", s_array[1], &s_array[1][0]);

printf("***************\n");

// end

*(p + offset)

p[offset]

// *指標變數, 訪問指標變數裡面存放的記憶體位址的記憶體資料

// 存放位址的變數;

p = b; // *p --> p記憶體位址,記憶體資料,

printf("%d, %d\n", *p, b[0]);

p = b + 1; // p 存放的是陣列第1個元素位址;

printf("%d, %d\n", *p, b[1]);

p = &b[2];

printf("%d, %d\n", *p, b[2]);

// end

// *指標變數, 指標變數[offset];

// 指標變數[offset]:訪問的是從這個指標儲存的位址開始,偏移offset個元素(sizeof(型別))的記憶體資料;

// 以指標變數為記憶體基位址(開始位址) 偏移offset個元素(不是位元組);

// 為什麼陣列的索引是從0開始的,因為陣列的名字表示的是首位址,而最開始的元素,就是從首位址開始存的,所以偏移是0;

p = b;

printf("%d, %d\n", p[0], b[0]);

// 指標的加;

// p + offset, 是以p為首位址,然後正向偏移offset個元素(不是位元組)的位址

// 數值上 p儲存的記憶體位址 + offset * sizeof(資料型別);

p = b;

printf("b[1]的位址 0x%x, 0x%x, 0x%x\n", p + 1, &b[1], b + 1);

// *(指標變數 + offset) 來訪問我們的記憶體資料;

printf("b[2]: %d, %d, %d\n", *(p + 2), p[2], b[2]);

// *(陣列名字 + offset)來訪問我們的記憶體資料;

printf("b[2]: %d, %d, %d\n", *(b + 2), p[2], b[2]);

// end

// 指標減: p - offset向前挪動offset個元素()

p = b + 1; // p指向了陣列的第1個元素的位址;

printf("b[0]: %d, %d\n", b[0], *(p - 1));

// 指標和陣列,不要越界,包保正使用指標訪問的每乙個記憶體是合法的;

// end

p = b;

for (int i = 0; i < 3; i++, p++)

p = s_array;

for (int i = 0; i < 3; i++)

printf("\n");

}// 指標每次儲存二維陣列的每行的位址

p = s_array;

// 有多少行

for (int i = 0; i < 3; i++)

p += 3; // 每行3個元素,所以跳到下一行;

printf("\n");

}

C C 指標與陣列

在二維陣列傳參時,經常遇到這樣的問題,不能將 int 轉換為 int 5 雖然二維陣列a 5 5 的a是二級指標,但是用int 是單純的二級指標,但是二維陣列的a是完全不同的。a 0 表示第一行一維陣列,a 1 表示第二行二維陣列,a是具有結構的,這一點和普通的二級指標具有很大的區別。int p 5...

C C 陣列與指標

經常使用stl導致陣列與指標都陌生了,複習總結一下 c c 裡指標確實更高效了,也更複雜了 陣列的建立 type t arr name const n type t指數組的元素型別,const n指常量表示式 int arr 10 is ok陣列的初始化 int arr1 10 不進行初始化,存放未...

C C 陣列與指標

include using namespace std int main char pa a cout pacout pa cout pacout pa cout pa signal segmentation fault core dumped return 0 編譯器不識別陣列 陣列就是指標a就是...