【数组指针】 仅此一篇 让你深刻理解数组指针
数组指针和指针数组
例题
#include<stdio.h>
double a2(int (*p)[4],int n){
int i;
double sum=0;
p=p+n;
for(i=0;i<4;i++)
sum+=(*p)[i];
return sum/4;
}
double a1(int p[],int n) {
double sum=0;
int *p1=p;
for(;p<p1+n;p++)
sum+=*p;
return sum/n;
}
int main( ) {
int i,j;
int s[3][4],(*p)[4];
for(p=s;p<s+3;p++)
for(i=0;i<4;++)
scanf("%d",*p+i);
printf("%6.2lf%6.2lf",a1(s[1],6),a2(s,2));
return 0;
}
输入:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
输出:
7.50 10.50
分析
1 2 3 4
5 6 7 8
9 10 11 12
a1(s[1],6)
传给函数a1
的是s的第二行:5 6 7 8
,在a1
中
double a1(int p[],int n) {
double sum=0;
int *p1=p;
for(;p<p1+n;p++)
sum+=*p;
return sum/n;
}
p
就是第二行的首址,由于该数组在内存中是行优先存放的,因此在for
循环中,实际遍历的是5 6 7 8 9 10
六个数。45/6=7.50
。
a2(s,2)
传给函数double a2(int (*p)[4],int n)
的是二维数组s
,用一个函数指针int (*p)[4]
来接收,其实际上是行指针,也就说p
此时指向s
的第一行。
double a2(int (*p)[4],int n){
int i;
double sum=0;
p=p+n;
for(i=0;i<4;i++)
sum+=(*p)[i];
return sum/4;
}
其中的p=p+n;
将p
改为指向s
的第三行9 10 11 12
,结果就是42/4=10.50
。
printf格式化输出
"%6.2lf"
- 保留两位小数,若只有一位小数,则百分位用0占位;
- 若小数个数大于2,则千分位四舍五入;
- 输出宽度为6个单位,由于小数点占一位,因此整数部分为
6-1-2=3
位,若整数个数大于3,则整数部分全输出。若整数个数为0~2,则前面留空。
#include<stdio.h>
int main()
{
printf("%6.2lf\n", 56.1);
printf("%6.2lf\n", 123456.1);
printf("%6.2lf\n", 123456.123);
printf("%6.2lf\n", 123456.125);
return 0;
}
输出:
56.10
123456.10
123456.12
123456.13