一、数组和指针之间的关系
1.指针为地址,数组arr也为地址
所以*p=arr;所以可以通过*p来改变数组的数据。
ps:简单来说:
int *p = arr;
*(p+i) == arr[i];
2.指针与数组地址的变化
-
#include<>//预编译处理
-
-
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;
返回值通常只能返回一个值,通过指针可以返回多个值,用变量的地址来改变变量
-
#include<>//预编译处理
-
//替换,用指针直接引出来
-
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<>//预编译处理
-
-
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<>//预编译处理
-
#include<>//断言
-
#include<>//为了使用string_len(求长度),,char*arr(指针),strcpy(),stremp
-
#include<>//为了使用判断是否字母,数字,空格
-
#include<>//静态内存开放
-
#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<>//预编译处理
-
#include<>//断言
-
#include<>//为了使用string_len(求长度),,char*arr(指针),strcpy(),stremp
-
#include<>//为了使用判断是否字母,数字,空格
-
#include<>//静态内存开放
-
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)对数组数据进行修改
然后通过指针进行修改,然后返回到实参中。