指针与数组的关系

本文探讨了指针和数组在C/C++中的密切关系。数组名实际上是一个指向首元素的指针,允许通过指针操作改变数组内容。通过指针可以实现返回多个值、计算数组长度等功能。此外,还介绍了如何使用指针对数组数据进行移动和处理,例如报数问题和数据右移操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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)对数组数据进行修改

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值