網(wǎng)站建設(shè)招標(biāo)公告首頁(yè)排名關(guān)鍵詞優(yōu)化
目錄
1.數(shù)組的地址
?2.通過(guò)指針訪問(wèn)數(shù)組
3.數(shù)組和指針的不同點(diǎn)
?4.指針數(shù)組
1.數(shù)組的地址
數(shù)組的地址是什么?
看下面一組代碼
#include <stdio.h>
int main()
{
int arr[5] = {5,4,3,2,1};
printf("&arr[0] = %p\n", &arr[0]);
printf("arr = %p\n", arr);
return 0;
}
?運(yùn)行結(jié)果:
從上面代碼中可以看到數(shù)組名和首元素的地址和是一樣的
但是有不同的情況
舉例:
#include <stdio.h>
int main()
{int arr[6] = { 5,4,3,2,1,0 };printf("&arr[0] = %p\n", &arr[0]);printf("&arr[0]+1 = %p\n\n", &arr[0]+1);printf("arr = %p\n", arr);printf("arr+1 = %p\n\n", arr+1);printf("&arr = %p\n", &arr);printf("&arr+1 = %p\n\n", &arr+1);return 0;
}
運(yùn)行結(jié)果
可以看到當(dāng)對(duì)&arr[0],arr,&arr都+1時(shí),&arr[0]和arr都移動(dòng)了4個(gè)字節(jié),而&arr移動(dòng)了16個(gè)字節(jié)也就是整個(gè)數(shù)組的長(zhǎng)度。
實(shí)際上除了&數(shù)組名表示整個(gè)數(shù)組的地址,在使用sizeof(數(shù)組名)計(jì)算數(shù)組的字節(jié)數(shù)時(shí)時(shí),sizeof中的數(shù)組名表示的也是整個(gè)數(shù)組的地址。
總結(jié):數(shù)組名表示的是數(shù)組首元素的地址,但有兩個(gè)例外:
1.&數(shù)組名
這里的數(shù)組名實(shí)際上表示的是整個(gè)數(shù)組的地址
2.sizeof(數(shù)組名)
這里的數(shù)組名也表示整個(gè)數(shù)組的地址,計(jì)算的是整個(gè)數(shù)組的字節(jié)數(shù)。
?2.通過(guò)指針訪問(wèn)數(shù)組
#include <stdio.h>
int main()
{int arr[5] = { 0,1,2,3,4, };int i = 0;int n = 100;int* p = arr;for (i; i < 5; i++)//通過(guò)指針p給數(shù)組重新賦值{*p = n;n++;p ++;}for (i = 0; i < 5; i++)//打印數(shù)組每個(gè)元素{printf("%d ", arr[i]);}return 0;
}
運(yùn)行結(jié)果:
可以看到數(shù)組的值可以通過(guò)指針被改變
把代碼稍作修改:
#include <stdio.h>
int main()
{int arr[5] = { 0,1,2,3,4, };int i = 0;int n = 100;int* p = arr;for (i; i < 5; i++)//通過(guò)指針p給數(shù)組重新賦值{*p = n;n++;p++;}for (i = 0; i < 5; i++)//打印地址{printf("&arr[i] =%d\np+i =%d\n", &arr[i],p+i);}return 0;
}
運(yùn)行結(jié)果:?
?
?可以看到arr[i]的地址就是指針變量p+1的地址,這也是通過(guò)指針更改變數(shù)組的每一個(gè)元素的原因
3.數(shù)組和指針的不同點(diǎn)
int arr[10];
int * p = arr:
p = arr;
//ok
?當(dāng)給p進(jìn)行賦值時(shí)程序會(huì)正常執(zhí)行
int arr[10];
int brr[10];
arr = brr;
//err
?當(dāng)給函數(shù)名賦值時(shí)程序會(huì)報(bào)錯(cuò)
總結(jié):賦值表達(dá)式的左操作數(shù)不能是數(shù)組名,但可以是指針變量。
?4.指針數(shù)組
指針數(shù)組就是存放指針的數(shù)組
例如:
#include <stdio.h>
int main()
{int a = 0;int* p = &a;int* pp = &a;int* ppp = &a;int arr[3] = { *p,*pp,*pp };printf("%d %d %d\n", arr[0], arr[1], arr[2]);return 0;
}
運(yùn)行結(jié)果:
?
通過(guò)上面的代碼可以看到通過(guò)指針數(shù)組的元素,也能訪問(wèn)到指針指向的變量。
?注意:指針數(shù)組是數(shù)組,而數(shù)組指針是指針
指針數(shù)組是存放指針的數(shù)組,數(shù)組指針是指向數(shù)組的指針。