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]); //因为下标的形式访问数组最终都是转换成指针的形式。}}
