在平常定义数组的时候常使用 int arr[5]={1,2,3,4,5}
在提取数组arr中的值的时候,会用arr[0],arr[1],arr[2]…来表示数组中的某个元素
学习中发现,方括号的意义其实可以和指针相关
例如 对于 上面的一维arr数组 :
int *p=arr;
那么会有: *p+i 等价于 arr[i]
对于print1函数和print2函数输出结果一致:
#include <stdio.h>
void print1(int arr[5],int x)
{
int i=0;
for(i=0;i<x;++i)
{
printf("%d ",arr[i]);
}
}
void print2(int *p ,int x)
{
int i=0;
for(i=0;i<x;++i)
{
printf("%d ",*p+i);
}
}
int main()
{
int arr[5]={1,2,3,4,5};
print1(arr,5);
printf("\n");
print2(arr,5);
return 0;
}
输出结果:
对于二维数组:
void print1(int arr[][5],int x,int y)
{
int i=0;
for(i=0;i<x;++i)
{
int j=0;
for(j=0;j<5;++j)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
void print2(int (*p)[5],int x, int y)
{
int i=0;
for(i=0;i<x;++i)
{
int j=0;
for(j=0;j<y;++j)
{
// printf("%d ",(*(p+i))[j]);//(*(p+i))==arr[i] --> (*(p+i))[j]==arr[i][j]
printf("%d ",p[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};
print1(arr,3,5);
printf("\n");
print2(arr,3,5);
return 0;
}
输出结果:
指针总结
数组名除了两种情况以外都是指数组首元素地址:
1)sizeof(数组名)求的是整个数组所占空间单位为字节
2)&数组名 表示取整个数组的首地址,以数组为单位偏移
可以尝试运行如下代码查看:
#include <stdio.h>
int main()
{
int arr[5] = {0};
printf("arr = %p\n", arr);
printf(" &arr = %p\n", &arr);
printf("&arr[0] = %p\n", &arr[0]);
printf("arr + 1 = %p\n", arr + 1);
printf("&arr[0] + 1 = %p\n", &arr[0] + 1);
printf("&arr + 1 = %p\n", &arr + 1);
printf("sizeof(arr) = %lu\n", sizeof(arr));
return 0;
}
结果如图:
arr 虽然和&arr地址相同,但是其表达的意义不同,而对于取具体数组元素地址例如&arr[0]则只是正常取地址,不容易混淆。
继续总结:
对于[ ] 可以理解为解引用 ,例如arr[1] 等价于 *arr+1
arr[i] 等价于 *arr+i;
对于二维数组例如:
int array[ ][3]={{1,2,3},{2,3,4},{3,4,5}}
一下代码块表示什么意思呢?
int (p)[3]=array;
答:
既然 array 是数组名,且不是上述两种情况,那么我们就应当把它理解为数组的首元素地址。只不过相对一维数组而言,应当把二维数组的首元素理解为一维数组。例如上述的array[ ][3]数组对应的p应该是指向{1,2,3}这个一维数组的地址,也就是整行的地址而不应该简单理解为二维数组第一行第一列的元素地址!