(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++,指针地址的改变