1、一维数组和指针

一维数组名是个指针常量,指向第一个元素的地址。通过下标的形式访问数组最终都是转换成指针的形式

  1. /*
  2. arr[0] => *(arr+0) arr[1] => *(arr+1) .....
  3. 因为数组名arr指向的是第一个元素的地址,并且数组的内存是连续的。
  4. */
  5. int arr[] = {1,2,3};
  6. int * array = arr;//arr => arr[0]的地址
  7. //arr[1] => *(arr+1)

所以当我们想要访问别的局部作用域的数组,就需要用到数组指针。

  1. void main()
  2. {
  3. int arr[] = {1, 2, 3};
  4. printf("%p\n", &arr[0]);
  5. printf("%p\n", &arr[1]);
  6. //以上输出可以看出数组的内存是连续的
  7. printf("%p\n", arr);
  8. printf("%p\n", arr + 1);//等同于&arr[1]
  9. //因为数组名是指针变量,指向第一个元素的地址,所以在连续的内存空间中(比如数组),就可以对地址进行加运算,取得下一个元素的内存地址,实际上数组下标的访问最终也是转换成指针的方式。
  10. getArray(arr, sizeof(arr));
  11. getchar();
  12. }
  13. //最终利用数组在内存中连续,通过指针可以在任意作用域中访问不同作用域的数组了。
  14. void getArray(int *arr, int len)
  15. {
  16. len = len / 4;
  17. printf("%d\n", *arr);
  18. printf("%d\n", *(arr + 1)); //通过arr+1就可以在arr的基础上 + 一个整型的长度 就得到下一个元素的地址
  19. printf("%d\n", arr[1]); //等价于上面,因为arr是指针变量,arr[i] => *(arr+i)
  20. for (int i = 0; i < len; i++)
  21. {
  22. printf("== %d\n", *(arr + i));
  23. printf("---%d\n", arr[i]); //因为下标的形式访问数组最终都是转换成指针的形式。
  24. }
  25. }