关于C的数组指针

xiaoxiao2021-02-28  43

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

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

转载请注明原文地址: https://www.6miu.com/read-2620112.html

最新回复(0)