通过指针操作数组元素

  • 数组名字是数组的首元素地址,但它是一个常量
    • 和 [] 效果一样,都是操作指针所指向的内存
  1. #include <stdio.h>
  2. int main() {
  3. int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  4. int i = 0;
  5. int n = sizeof(a) / sizeof(a[0]);
  6. for (i = 0; i < n; i++) {
  7. // * 和 [] 效果一样,都是操作指针所指向的内存
  8. // printf("%d, ", a[i]);
  9. printf("%d, ", *(a + i));
  10. }
  11. printf("\n");
  12. // 定义一个指针变量保存a的地址
  13. int *p = a;
  14. for (i = 0; i < n; i++) {
  15. // printf("%d, ", p[i]);
  16. printf("%d, ", *(p + i));
  17. }
  18. printf("\n");
  19. return 0;
  20. }

指针数组

  • 指针数组,它是数组,数组的每个元素都是指针类型
  1. #include <stdio.h>
  2. int main() {
  3. // 指针数组
  4. int *p[3];
  5. int a = 1;
  6. int b = 2;
  7. int c = 3;
  8. // 指针变量赋值
  9. p[0] = &a;
  10. p[1] = &b;
  11. p[2] = &c;
  12. for (int i = 0; i < sizeof(p) / sizeof(p[0]); i++) {
  13. printf("%d, ", *(*(p + i)));
  14. // printf("%d, ", *(p[i]));
  15. }
  16. printf("\n");
  17. return 0;
  18. }

数组名做函数参数

  • 数组名做函数参数,函数的形参本质上就是指针
  1. #include <stdio.h>
  2. // 下面3种写法完全等价
  3. // void print_arr(int a[10], int n)
  4. // void print_arr(int a[], int n)
  5. void print_arr(int *a, int n) {
  6. int i = 0;
  7. for (i = 0; i < n; i++) {
  8. printf("%d, ", a[i]);
  9. }
  10. printf("\n");
  11. }
  12. int main() {
  13. int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  14. int n = sizeof(a) / sizeof(a[0]);
  15. // 数组名做函数参数
  16. print_arr(a, n);
  17. return 0;
  18. }