目錄
陣列記憶體位址
指標 + 偏移
指標加減法
指標變數遍歷陣列
// 取乙個變數的位址 &符號;
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就是...