一、数组和指针之间的关系
1.指针为地址,数组arr也为地址
所以*p=arr;所以可以通过*p来改变数组的数据。
ps:简单来说:
int *p = arr;
*(p+i) == arr[i];2.指针与数组地址的变化
#include<stdio.h>//预编译处理 int main() { int arr[] = { 1,2,3,4,5 }; int* p = arr; p += 1; p += 1; p--;//p-=1; printf("%d", *p ); }
如图:arr=0;arr=p;
p增加了两次,所以arr增加了两次。
最后输出arr=*p=2;
3.return 返回值通常只能返回一个值,通过指针可以返回多个值,用变量的地址来改变变量
#include<stdio.h>//预编译处理 //替换,用指针直接引出来 void Operate(int a, int b, int* sum, int* mul) { *sum = a + b; *mul = a * b; } int main() { int sum, mul; Operate(10, 20, &sum, &mul); printf("%d %d\n",sum,mul); }
4.计算数组的长度,用函数来调用。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>//预编译处理 int Getsum(int* arr, int len)// 形参 指针 int *arr; { assert(arr != NULL && len >= 0);//debug开发模式,断言 if (arr == NULL) { //exit(EXIT_FAILURE);失败 } int sum = 0; for (int i = 0; i < len; i++) { sum += arr[i]; } return sum; } int main()//从键盘输入数据 { int arr[10],n; printf("输入数据的长度"); scanf("%d", &n); printf("输入数据\n"); for (int i = 0; i < n; i++) { scanf("%d", arr+i); } int len = n; int sum=Getsum(arr, len); printf("%d", sum); } //int main()//直接给数据 //{ // int arr[] = { 1,2,3,4,5 }; // int len = sizeof(arr) / sizeof(arr[0]); // int sum=Getsum(arr, len); // printf("%d", sum); //}
Getsum(int* arr, int len)为形参函数,下面的int main()中为实参。
通过形参返回到实参中获得数组长度。
5.报数问题,报到3的数退出,最后输出最后留的数字。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>//预编译处理 #include<assert.h>//断言 #include<string.h>//为了使用string_len(求长度),,char*arr(指针),strcpy(),stremp #include<ctype.h>//为了使用判断是否字母,数字,空格 #include<stdlib.h>//静态内存开放 #define NUM 3 //报数问题 int CicleNum(int* arr, int len) { assert(arr != NULL); int left = len;// 剩余的人数 int count = 0;// 报数 NUM 退出 int res = -1;// 返回剩余一个人的编号 for (int i = 0; left > 1; i = ++i % len) { if (*(arr + i) != -1) { //arr[i] count++; } if (count == NUM) { // 报数为NUM的人退出 *(arr + i) = -1; count = 0; left--; } } for (int i = 0; i < len; i++) { if (*(arr + i) != -1) { res = *(arr + i);//arr[i] } } return res; } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; printf("最后留的数字为%d", CicleNum(arr, 10)); }
.ps:通过形参函数,用数组的指针来变更数组本身的数值。
6.问题:对于数组中数据的移动
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>//预编译处理 #include<assert.h>//断言 #include<string.h>//为了使用string_len(求长度),,char*arr(指针),strcpy(),stremp #include<ctype.h>//为了使用判断是否字母,数字,空格 #include<stdlib.h>//静态内存开放 void Move_Right_M(int* arr, int len, int m) { assert(arr != NULL && m <= len && m >= 0); for (int i = 0; i < m; i++) { int temp = arr[len - m + i]; for (int j = len - m + 1; j > i; j--) { arr[j] = arr[j - 1]; } arr[i] = temp; } } int main() { int arr[10]; printf("请输入数据长度"); int n; scanf("%d", &n); printf("请输入数据"); for (int i = 0; i < n; i++) { scanf("%d", arr+i); } printf("请输入移动数据个数"); int m; scanf("%d", &m); Move_Right_M(arr, n, m); for (int i = 0; i < n; i++) { printf("%d", arr[i]); } return 0; }
ps:其中m为移动数据的个数,n为数据长度。
通过函数:void Move_Right_M(int* arr, int len, int m)对数组数据进行修改
然后通过指针进行修改,然后返回到实参中。
指针与数组的关系
最新推荐文章于 2025-07-08 19:32:53 发布