一、一维数组和指针
1.定义一个一维数组,数组名是这个数组的首地址。
int a[5];? ? ? /?/ 5表示有五个元素a[0],a[1],a[2],a[3],a[4],不是指从a[0]到a[5]。
a指向a[0], a[0]为int类型元素,所以a的类型是int*。
a这个地址指向a[0] int元素,int*;4? ?(一个元素四个字节)
&a这个地址指向整个数组 int*[5]; 20?
? 2.a和&a的区别:
int a[5];
printf("a=%d\n",a)
printf("&a=%d\n",&a)
printf("a+1=%d\n",a+1) //偏移四个字节
printf("&a+1=%d\n",a+1) //偏移20个字节
其中第一段和第二段输出代码输出结果相同,即值相同。但仅在值上同为a[0]的首地址,前者指向数组首地址,后者指向整个数组(具体由第三第四段输出代码的偏移结果可以看出)。
3.访问数组元素
a)下标法:a[i];
b)指针法:
int a[5]={1,2,3,4,5};
int *p= a;? ? ? ? ? //p指向a[0]
for (int i=0;i<5;i++)
{? ?
printf("%d",*(p+1));? ? ? ?//当为*(p+1)时遍历,p不会变;用*p++时,则p会变!
//因为p指向a[0],所以可以将*(p+1)换成*(a+1),但不能*a++,a为数组名是不能改变的,会报错!
}? ? ? ? ? //因为*的优先级比+高,故需要先用括号*(p+1),而*和++优先级相同,从右往左;
二、二维数组和指针
?简略画图描述:二维数组a[3][4], 由三个一维数组组成,其中每个一维数组包含四个元素;
a指向a[0]这个一维数组, 故a的类型为int*[4], a+1, 则偏移16个字节;
a[0]指向a[0][0]这个元素,故a[0]的类型为int*, a[0]+1,则4B。
注:a和a[0]在数值上相等,但指向不同!
int a[3][4];
a int*[4];? ?→指向一维数组,是一个数组指针
&a? int(*) [3][4]? ? →指向整个数组
a[0]? int*? →指向a[0][0],为一维数组a[0]的首地址
a[0][0]? ?int类型
多维数组:
int a[2][3][4]:? ?
a指向二维数组;a[0]指向一维数组;a[0][0]指向一个元素?
以上内容仅为个人学习记录,如有错误,请各位指正,共勉!?
|