一、数组与指针有什么关系
(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++,指针地址的改变