前言
變量:就是給內(nèi)存地址取一個別名;
1. 看一組現(xiàn)象
代碼如下:
// 數(shù)組與數(shù)組指針
void main(){
// 定義一個數(shù)組
int arr[] = {1,2,3,4};
// 看一種現(xiàn)象: arr的值 = arr取地址的值 = arr[0]的地址的值蚂四,arr[0]的值就是首地址
printf("arr = %p\n" , arr); // 打印數(shù)組: arr = 003DFE84
printf("arr& = %p\n", &arr);// 打印數(shù)組地址: arr& = 003DFE84
printf("arr[0]& = %p\n", &arr[0]); // 打印數(shù)組第0個位置的地址: arr[0] & = 003DFE84
getchar();
}
從上邊代碼可以看出:
arr的值 = arr取地址的值 = arr[0]的地址的值遂赠,而這個 arr[0]的值就是 首地址,這個首地址很重要镇饺。
2. 如何獲取數(shù)組指針送讲?
數(shù)組指針 指向的就是 數(shù)組的首地址,也就是 數(shù)組 第一個元素的地址监右。
可以根據(jù)下邊方式獲取數(shù)組指針:
// 數(shù)組與數(shù)組指針
void main(){
// 定義一個數(shù)組
int arr[] = {1,2,3,4};
// 看一種現(xiàn)象: arr的值 = arr取地址的值 = arr[0]的地址的值健盒,arr[0]的值就是首地址
printf("arr = %p\n" , arr); // 打印數(shù)組: arr = 003DFE84
printf("arr& = %p\n", &arr);// 打印數(shù)組地址: arr& = 003DFE84
printf("arr[0]& = %p\n", &arr[0]); // 打印數(shù)組第0個位置的地址: arr[0] & = 003DFE84
// 如何獲取數(shù)組的指針
// int[]* arr_p = &arr; 這種寫法不行称簿,因為c中沒有這種寫法
// 數(shù)組指針一般都是:用int*去接,然后直接等于arr就可以
int* arr_p = arr ;
getchar();
}
所以以后如果要獲取數(shù)組的指針父虑,可以直接 int* arr_p = arr ;就可以了
3. 挪動數(shù)組指針
代碼如下:
// 數(shù)組與數(shù)組指針
void main(){
// 定義一個數(shù)組
int arr[] = {1,2,3,4};
// 數(shù)組指針一般都是:用int*去接士嚎,然后直接等于arr就可以
// arr可以看做是上邊的arr[0]
// 數(shù)組指針指向的是數(shù)組的首地址
int* arr_p = arr;
// 數(shù)組第1位值
printf("%d\n" , *arr_p); // *arr_p: 就是對arr取值悔叽,也就是對 arr[0]取值,也就是1
// 比如:對指針++
// 數(shù)組指針挪動1位
arr_p++; // 對指針++笨蚁,表示指針從1移動到2的位置九火,然后再通過 *arr_p對指針取值,就是2
printf("%d\n", *arr_p);
// 數(shù)組指針從2的位置:再移動2位勒极,就到4的位置了
arr_p += 2;
printf("%d\n", *arr_p); // 4
// 數(shù)組指針從4的位置:再移動1位虑鼎,由于已經(jīng)超出了自定義 arr的范圍键痛,這個時候指針就移動到了系統(tǒng)內(nèi)存中了匾七,
// 這個時候打印的值就是系統(tǒng)的內(nèi)存的值昨忆,我們看不懂,但是這里不會角標越界
arr_p += 1;
printf("%d", *arr_p);
// 上邊輸出語句打印結(jié)果如下:
// 1
// 2
// 4
// - 858993460 這個是系統(tǒng)內(nèi)存的值席里,我們看不懂
getchar();
}
4. 分析如下
分析:
1. 定義int* arr_p = arr之后拢驾,就表示指針 arr_p已經(jīng)在數(shù)組第一個位置伪冰,也就是 *arr_p揣炕,因為 *arr_p = arr[0]
的值稠腊,所以 arr_p的指針指向數(shù)組第一個值就是 1, 此時 printf("%d\n" , *arr_p) 的值就是1褐啡;
2. arr_p++:表示指針向后移動一位鳖昌,就移動到了 2的位置许昨,此時 printf("%d\n", *arr_p) 的值就是2褥赊;
3. arr_p += 2:表示指針從 上邊2 的位置移動 2位,到4拌喉,此時 printf("%d\n", *arr_p) 的值就是4尿背;
4. 如果把上邊的 arr_p += 2換成 arr_p += 3:表示指針從 2的位置移動到 4的后一位,由于已經(jīng)超出了 定義的arr
數(shù)組范圍荔烧,所以 這個時候指向的就是 系統(tǒng)的內(nèi)存,但是角標不會越界鹤竭;
5. 分析圖如下
圖片.png