指针与数组的关系

时间:2024-10-02 07:05:33

一、数组和指针之间的关系

1.指针为地址,数组arr也为地址

所以*p=arr;所以可以通过*p来改变数组的数据。

ps:简单来说:
      int *p = arr;
     *(p+i)  == arr[i];

2.指针与数组地址的变化

  1. #include<>//预编译处理
  2. int main()
  3. {
  4.     int arr[] = { 1,2,3,4,5 };
  5.     int* p = arr;
  6.     p += 1;
  7.     p += 1;
  8.     p--;//p-=1;
  9.     printf("%d", *p );
  10.     
  11. }

如图:arr=0;arr=p;

p增加了两次,所以arr增加了两次。

最后输出arr=*p=2; 

返回值通常只能返回一个值,通过指针可以返回多个值,用变量的地址来改变变量

  1. #include<>//预编译处理
  2. //替换,用指针直接引出来
  3. void Operate(int a, int b, int* sum, int* mul)
  4. {
  5. *sum = a + b;
  6. *mul = a * b;
  7. }
  8. int main()
  9. {
  10. int sum, mul;
  11. Operate(10, 20, &sum, &mul);
  12. printf("%d %d\n",sum,mul);
  13. }
'
运行

4.计算数组的长度,用函数来调用。

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<>//预编译处理
  3. int Getsum(int* arr, int len)// 形参 指针 int *arr;
  4. {
  5. assert(arr != NULL && len >= 0);//debug开发模式,断言
  6. if (arr == NULL)
  7. {
  8. //exit(EXIT_FAILURE);失败
  9. }
  10. int sum = 0;
  11. for (int i = 0; i < len; i++)
  12. {
  13. sum += arr[i];
  14. }
  15. return sum;
  16. }
  17. int main()//从键盘输入数据
  18. {
  19. int arr[10],n;
  20. printf("输入数据的长度");
  21. scanf("%d", &n);
  22. printf("输入数据\n");
  23. for (int i = 0; i < n; i++)
  24. {
  25. scanf("%d", arr+i);
  26. }
  27. int len = n;
  28. int sum=Getsum(arr, len);
  29. printf("%d", sum);
  30. }
  31. //int main()//直接给数据
  32. //{
  33. // int arr[] = { 1,2,3,4,5 };
  34. // int len = sizeof(arr) / sizeof(arr[0]);
  35. // int sum=Getsum(arr, len);
  36. // printf("%d", sum);
  37. //}

Getsum(int* arr, int len)为形参函数,下面的int main()中为实参。

通过形参返回到实参中获得数组长度。

5.报数问题,报到3的数退出,最后输出最后留的数字。

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<>//预编译处理
  3. #include<>//断言
  4. #include<>//为了使用string_len(求长度),,char*arr(指针),strcpy(),stremp
  5. #include<>//为了使用判断是否字母,数字,空格
  6. #include<>//静态内存开放
  7. #define NUM 3
  8. //报数问题
  9. int CicleNum(int* arr, int len)
  10. {
  11. assert(arr != NULL);
  12. int left = len;// 剩余的人数
  13. int count = 0;// 报数 NUM 退出
  14. int res = -1;// 返回剩余一个人的编号
  15. for (int i = 0; left > 1; i = ++i % len)
  16. {
  17. if (*(arr + i) != -1) { //arr[i]
  18. count++;
  19. }
  20. if (count == NUM) { // 报数为NUM的人退出
  21. *(arr + i) = -1;
  22. count = 0;
  23. left--;
  24. }
  25. }
  26. for (int i = 0; i < len; i++) {
  27. if (*(arr + i) != -1) {
  28. res = *(arr + i);//arr[i]
  29. }
  30. }
  31. return res;
  32. }
  33. int main()
  34. {
  35. int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  36. printf("最后留的数字为%d", CicleNum(arr, 10));
  37. }

.ps:通过形参函数,用数组的指针来变更数组本身的数值。

6.问题:对于数组中数据的移动

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<>//预编译处理
  3. #include<>//断言
  4. #include<>//为了使用string_len(求长度),,char*arr(指针),strcpy(),stremp
  5. #include<>//为了使用判断是否字母,数字,空格
  6. #include<>//静态内存开放
  7. void Move_Right_M(int* arr, int len, int m)
  8. {
  9. assert(arr != NULL && m <= len && m >= 0);
  10. for (int i = 0; i < m; i++)
  11. {
  12. int temp = arr[len - m + i];
  13. for (int j = len - m + 1; j > i; j--)
  14. {
  15. arr[j] = arr[j - 1];
  16. }
  17. arr[i] = temp;
  18. }
  19. }
  20. int main()
  21. {
  22. int arr[10];
  23. printf("请输入数据长度");
  24. int n;
  25. scanf("%d", &n);
  26. printf("请输入数据");
  27. for (int i = 0; i < n; i++)
  28. {
  29. scanf("%d", arr+i);
  30. }
  31. printf("请输入移动数据个数");
  32. int m;
  33. scanf("%d", &m);
  34. Move_Right_M(arr, n, m);
  35. for (int i = 0; i < n; i++)
  36. {
  37. printf("%d", arr[i]);
  38. }
  39. return 0;
  40. }

ps:其中m为移动数据的个数,n为数据长度。

通过函数:void Move_Right_M(int* arr, int len, int m)对数组数据进行修改

然后通过指针进行修改,然后返回到实参中。