2.以指针变量做参数
#include "stdio.h"
#define NUM 5
int main()
{
int i,arr[NUM]={2,4,8,5,6};
for(i=0;i<NUM;i++)
{
printf("%d",arr[i]);
}
printf("
");
change(arr);
for(i=0;i<NUM;i++)
{
printf("%d",arr[i]);
}
printf("
");
}
change(int arr[])
{
int *p ,temp,*i,*j,m;
m = (NUM-1)/2;
/* 指针赋值 */
i = arr;
j = arr+NUM-1;
p = arr+m;
for(;i<=p;i++,j--)
{
temp = *i;
*i = *j;
*j = temp;
}
return;
}
从一个数组中找出最大值和最小值
1.数组为参数
#include "stdio.h"
#define NUM 7
int max , min;
int main()
{
void max_min(int arr[]);
int i,arr[NUM]={2,4,8,1,9,5,6};
for(i=0;i<NUM;i++)
{
printf("%d",arr[i]);
}
printf("
");
max_min(arr);
printf("max:%d,min:%d
",max,min);
}
void max_min(int arr[])
{
int *_max,*_min,*arrend,*p;
max = min =*arr; //初始化
arrend = arr+NUM;
for(p=arr;p<=arrend;p++)
{
if(*p>max)
{
max = *p;
}
else if(*p<min)
{
min = *p;
}
}
return;
}
2.指针为参数
#include "stdio.h"
#define NUM 7
int max , min;
int main()
{
void max_min(int arr[]);
int i,arr[NUM]={2,4,8,1,9,5,6};
int *p ;
p=arr;
for(i=0;i<NUM;i++)
{
printf("%d ",arr[i]);
}
printf("
");
max_min(p);
printf("max:%d,min:%d
",max,min);
}
void max_min(int *p)
{
int *_max,*_min,*arrend;
max = min =*p;
arrend = p+NUM;
int * b;
for(b=p;b<arrend;b++)
{
if(*b>max)
{
max = *b;
}
else if(*b<min)
{
min = *b;
}
}
return;
}
多维数组的指针:
二维数组比一维数组复杂难懂,概念不一样
例如:设
int arr[3][4] {{1,3,5,7},{9,11,13,15},{17,19,21,23}};
arr是一个二维数组,从二维数组的角度来看 arr是二维数组的首地址即第0行的的首地址arr+1代表第1行的首地址。
如果arr首地址为2000则arr+1为2008,因为第0行有4个整形数据(整形占2个字节)所以arr+1是arr[1]的地址即 arr+4*2=2008。
arr[0],arr[1],arr[2],arr[3]都是二维数组名即他们也是地址arr[0]代表第0行一维数组第0列元素的地址即&arr[0][0]。
表示形式 含义 地址
a 二维数组名,数组首地址,0行的地址 2000
a[0],*(a+0),*a 第0行地址 2000
a+1,&a[1] 第1行地址首地址 2008
a[1],*(a+1) 第1行第0列地址 2008
a[1]+2,*(a+1)+2,&a[1][2] 第一行第二列地址 2012
*(a[1]+2),*(*(a+1)+2),a[1][2] 第一行第二列的值 值13
用指针变量输出数组元素的值
#include <stdio.h>
main()
{
int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21};
int *p;
for(p=a[0];p<a[0]+11;p++)
{
printf("%d ",*p);
}
}
输出二维数组任意一行任意一列的值:
#include <stdio.h>
main()
{
int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4],i,j; //*p有4个元素为整形 P所指向的是4个一维数组,即为行元素;
p=a;
scanf("i=%d,j=%d",&i,&j);
printf("a[%d,%d]=%d
",i,j,*(*(p+i)+j));//*(p+i)为地址+J个位置再算它的值
}
一个班3学生,4门课,算平均分即第N个学生的成绩
#include <stdio.h>
main()
{
void average(float *p,int n);
void search(float (*p)[4],int n);
float score [3][4] = {{65,67,70,62},{80,87,90,81},{90,99,100,98}};
int se;
average(*score,12);
printf("print the score NO:");
scanf("%d",&se);
search(score,se-1);
}
void average(float *p,int n)
{
float *p_end = p+n;
float sum = 0, avg;
for(;p<p_end;p++)
{
sum=sum+(*p);
}
avg = sum/n;
printf("%.2f
",avg);
}
void search(float (*p)[4],int n)
{
printf("the score of NO.%d
",n+1);
int i ;
for(i=0;i<4;i++)
{
printf("%.2f ",*(*(p+n)+i));
}
}
如果一门不及格,打印他所有的成绩:
#include <stdio.h>
main()
{
void search(float (*p)[4],int n);
float score [3][4] = {{65,67,70,62},{59,87,90,81},{90,99,100,98}};
search(score,3);
}
void search(float (*p)[4],int n)
{
int i ,j;
for(i=0;i<n;i++)
{
int flag = 0;
for(j=0;j<4;j++)
{
if(*(*(p+i)+j)<60)
{
flag = 1;
}
}
if(flag==1)
{
for(j=0;j<4;j++)
{
printf("%.2f ",*(*(p+i)+j));
}
}
}
}