1、一维数组和指针
一维数组名是个指针常量,指向第一个元素的地址。通过下标的形式访问数组最终都是转换成指针的形式。
/*
arr[0] => *(arr+0) arr[1] => *(arr+1) .....
因为数组名arr指向的是第一个元素的地址,并且数组的内存是连续的。
*/
int arr[] = {1,2,3};
int * array = arr;//arr => arr[0]的地址
//arr[1] => *(arr+1)
所以当我们想要访问别的局部作用域的数组,就需要用到数组指针。
void main()
{
int arr[] = {1, 2, 3};
printf("%p\n", &arr[0]);
printf("%p\n", &arr[1]);
//以上输出可以看出数组的内存是连续的
printf("%p\n", arr);
printf("%p\n", arr + 1);//等同于&arr[1]
//因为数组名是指针变量,指向第一个元素的地址,所以在连续的内存空间中(比如数组),就可以对地址进行加运算,取得下一个元素的内存地址,实际上数组下标的访问最终也是转换成指针的方式。
getArray(arr, sizeof(arr));
getchar();
}
//最终利用数组在内存中连续,通过指针可以在任意作用域中访问不同作用域的数组了。
void getArray(int *arr, int len)
{
len = len / 4;
printf("%d\n", *arr);
printf("%d\n", *(arr + 1)); //通过arr+1就可以在arr的基础上 + 一个整型的长度 就得到下一个元素的地址
printf("%d\n", arr[1]); //等价于上面,因为arr是指针变量,arr[i] => *(arr+i)
for (int i = 0; i < len; i++)
{
printf("== %d\n", *(arr + i));
printf("---%d\n", arr[i]); //因为下标的形式访问数组最终都是转换成指针的形式。
}
}