关于C的数组指针

一、数组与指针有什么关系

(1)地址

数组名就是一个地址,指向一个数组的开端。

下面举几个例子:

#include<stdio.h>
int main()
{
	int a[5] = { 7,0,5,8,5 };
	int *p = a;
	printf("%d\n", p);
        printf("%d\n", a);
	printf("%d\n", &a[0]);
        printf("%d\n", &a[1]);
}

前面说过 P是一个指针 指针的作用就是存储一个数据的地址

所以第一个printf将打印输出a数组的地址开端,

因为数组名就是一个地址,指向一个数组的开端,所以第二将打印出a数组的地址开端

第三个printf将打印数组的第一个元素的地址 结果应该与前两个相同。

为了对比我将第四个Printf打印出第二个元素的地址以作比较。


从实验结果我们可以看出前三个地址都是一样的,都是数组的开始地址,而最后一个是数组的第二个元素,因为是整型数据,地址加4。

(2)具体值

我们前面说 *这个符号的作用就是取一个地址的值,如*p就是取地址为p的值

那么我们根据前面就可以得出 

*p=a[0];
*(P+1)=a[1];
*(p+2)=a[2];
*(P+3)=a[3];
*(p+n)=a[n];

那么0[a] 1[a] 2[a]...n[a]又代表了什么

0[a]=a[0] 1[a]=a[1] n[a]=a[n];

为什么会这样呢 对比上方代码可知

n[a]=*(n+a)     *(n+a)=*(a+n)    *(a+n)=a[n];

所以 n[a]=a[n];

#include<stdio.h>
int main()
{
	int a[5] = { 7,0,5,8,5 };
	int *p = a;
	printf("%d\n", *p);
	printf("%d\n", *(p+1));
	printf("%d\n", *(p+2));
	printf("%d\n", *(p + 3));
	printf("%d\n", 0[a]);
	printf("%d\n", 1[a]);
	printf("%d\n", 2[a]);
	printf("%d\n", 3[a]);
}

(3)例子

假如现在有一个学生期末考试有n门成绩(门数由自己决定),请将他的各个科目的成绩输入,并利用指针的方法遍历数组,求该学生的最高成绩,最低成绩,总分,平均分。

方法一:

#include<stdio.h>
#define MAX 20
int main()
{
	int score[MAX];
	int sum = 0, stuscore, n;
	float avg;
	int *p;
	int max = 0, min = 100;
	printf("请输入该生有几门成绩:");
	scanf("%d", &n);
	printf("请分别输入该生%d门成绩:", n);
	for (p=score; p < score + n; p++)
	{
		scanf("%d", &stuscore);
		*p = stuscore;
	}
	for (p = score; p < score + n; p++)
	{
		sum = sum + *p;
		if (*p>max)
			max = *p;
		if (*p<min)
			min = *p;
	}
	avg = sum / n;
	printf("该生的总分,平均分分别为%d  %f:\n", sum, avg);
	printf("该生的最高分,最低分分别是%d  %d:\n", max, min);
	return 0;
}

方法二:

#define MAX 20
#include<stdio.h>
int main()
{
	int score[MAX];
	int sum = 0, stuscore, n;
	float avg;
	int *p;
	p = score;
	printf("请输入该生有几门成绩:");
	scanf("%d", &n);
	printf("请分别输入该生%d门成绩:", n);
	for (p; p < score + n; p++)
	{
		scanf("%d", &stuscore);
		*p = stuscore;
	}
	for (p = score; p < score + n; p++)
	{
		sum = sum + *p;
	}
	p = score;
	int max = *p, min = *p;
	for (p = score + 1; p < score + n; p++)
	{
		if (*p>max)
			max = *p;
		if (*p<min)
			min = *p;
	}
	avg = sum / n;
	printf("该生的总分,平均分分别为%d  %f:\n", sum, avg);
	printf("该生的最高分,最低分分别是%d  %d:\n", max, min);
	return 0;
}


指针一定要注意指针的初始化,尤其是循环后,p++,指针地址的改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值