/* 创建时间:20171230
创建人:fangweijun(773714759@qq.com)
功能:有一个整型数组a,有10个元素,要求输出数组中的全部元素(指针)
位置:C程序设计(第四版)2010年6月第四版 233页例8.6
*/
#include<stdio.h>
int main()
{
//方法一:下标法
// int a[10];
// int i;
// printf("please enter 10 integer numbers:");
// for(i=0;i<10;i++)
// scanf("%d",&a[i]);
// for(i=0;i<10;i++)
// printf("%d ",a[i]);//用下标找到
// printf("\n");
// return 0;
//方法二:通过数组名计算数组元素地址,找出元素的值
// int a[10];
// int i;
// printf("please enter 10 integer numbers:");
// for(i=0;i<10;i++)
// scanf("%d",(a+i));//scanf("%d",&a[i]);(a+i)就是地址
// for(i=0;i<10;i++)
// printf("%d ",* (a+i));//用地址找到
// printf("\n");
// return 0;
//方法三: 用指针变量指向数组元素
int a[10];
int * p,i;
printf("please enter 10 integer numbers:");
// for(i=0;i<10;i++)
// scanf("%d",&a[i]);
for(p=a;p<(a+10);p++)//p++指向下一个元素地址,a+10是值第10个元素地址等同于a[10]
scanf("%d",p);
for(p=a;p<(a+10);p++)//p++指向下一个元素地址
printf("%d ",* p);
printf("\0");
return 0;
}
/*Dev-c++输出结果:
please enter 10 integer numbers:0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
*/
/*Dev-c++输出结果:
please enter 10 integer numbers:11 22 33 44 55 66 77 88 99 100
11 22 33 44 55 66 77 88 99 100
*/
/*Dev-c++输出结果:
please enter 10 integer numbers:1 2 3 4 5 6 7 8 10 55
1 2 3 4 5 6 7 8 10 55
*/
/* 创建时间:20171230
创建人:fangweijun(773714759@qq.com)
功能:通过指针变量输出整型数组a的10个元素(指针)
位置:C程序设计(第四版)2010年6月第四版 235页例8.7
*/
#include<stdio.h>
int main()
{
int * p,i,a[10];
p=a;//p指向a[0]
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",p++);//输入10个整数给a[0]~a[10]
p=a;//缺少这个则p已经指向a[10]了,需要重新指向a[0]
for(i=0;i<10;i++,p++)
printf("%d ",* p);//想输出a[0]~a[10]
printf("\n");
return 0;
}
/*Dev-c++输出结果:
please enter 10 integer numbers:0 1 2 3 4 5 6 7 8 9
38 0 0 3 6487624 0 7738224 0 4199400 0
*/
/*Dev-c++输出结果:
please enter 10 integer numbers:0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
*/
/* 创建时间:20171230
创建人:fangweijun(773714759@qq.com)
功能:将数组a中n个整数按相反顺序存放(指针)
位置:C程序设计(第四版)2010年6月第四版 239页例8.8
*/
#include<stdio.h>
int main()
{
void inv(int x[],int n);
int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("The original array:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
inv(a,10);
printf("The array has been inverted:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
//void inv(int x[],int n)
//{
// int temp,i,j,m=(n-1)/2;
// for(i=0;i<=m;i++)
// {
// j=n-1-i;
// temp=x[i];
// x[i]=x[j];
// x[j]=temp;
// }
// return;
//}
//修函函数的形参为指针变量
void inv(int * x,int n)
{
int * p,temp,* i,* j,m=(n-1)/2;
i=x;//前面元素的地址
j=x+n-1;//后面元素的地址
p=x+m;//范围,前一半
for(;i<=p;i++,j--)
{
temp=* i;
* i=* j;
* j=temp;
}
return;
}
/*Dev-c++输出结果:
The original array:
3 7 9 11 0 6 7 5 4 2
The array has been inverted:
2 4 5 7 6 0 11 9 7 3
*/
/*Dev-c++输出结果:
The original array:
3 7 9 11 0 6 7 5 4 2
The array has been inverted:
2 4 5 7 6 0 11 9 7 3
*/
/* 创建时间:20171230
创建人:fangweijun(773714759@qq.com)
功能:将数组a中n个整数按相反顺序存放,用指针变量作实参(指针)
位置:C程序设计(第四版)2010年6月第四版 242页例8.9
*/
#include<stdio.h>
int main()
{
void inv(int x[],int n);
int i,arr[10],* p=arr;
printf("The original array:\n");
for(i=0;i<10;i++,p++)
scanf("%d",p);
printf("\n");
p=arr;//重新指向a[0]
inv(p,10);
printf("The array has been inverted:\n");
for(p=arr;p<arr+10;p++)
printf("%d ",* p);
printf("\n");
return 0;
}
void inv(int * x,int n)
{
int * p,temp,* i,* j,m=(n-1)/2;
i=x;//前面元素的地址
j=x+n-1;//后面元素的地址
p=x+m;//范围,前一半
for(;i<=p;i++,j--)
{
temp=* i;
* i=* j;
* j=temp;
}
return;
}
/*Dev-c++输出结果:
The original array:
1 2 3 4 5 6 7 8 9 10
The array has been inverted:
10 9 8 7 6 5 4 3 2 1
*/
/* 创建时间:20171230
创建人:fangweijun(773714759@qq.com)
功能:用指针方法对10个整数按由大到小顺序排序(指针)
位置:C程序设计(第四版)2010年6月第四版 244页例8.10
*/
#include<stdio.h>
int main()
{
void sort(int x[],int n);
int i,* p,a[10];
p=a;//指向a[0]
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",p++);//先输入,然后指向下一个地址
p=a;//重新指向a[0]
sort(p,10);
for(i=0;i<10;i++)
{
printf("%d ",*p);//输出该地址的数据
p++;
}
printf("\n");
return 0;
}
//下标法:
//void sort(int x[],int n)
//{
// int i,j,k,t;
// for(i=0;i<n-1;i++)//选择排序法
// {
// k=i;
// for(j=i+1;j<n;j++)
// if(x[j]>x[k])
// k=j;
// if(k!=i)//表示进行了交换
// {
// t=x[i];
// x[i]=x[k];
// x[k]=t;
// }
// }
//}
void sort(int * x,int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(* (x+j)>* (x+k))
k=j;
if(k!=i)//表示进行了交换
{
t=*(x+i);
* (x+i)=* (x+k);
* (x+k)=t;
}
}
}
/*Dev-c++输出结果:
please enter 10 integer numbers:12 2 54 654 -5 -65 89 5 0 4555
4555 654 89 54 12 5 2 0 -5 -65
*/
/*Dev-c++输出结果:
please enter 10 integer numbers:1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1
*/
/* 创建时间:20171230
创建人:fangweijun(773714759@qq.com)
功能:输出二维数组的有关数据(地址和值)(指针)
位置:C程序设计(第四版)2010年6月第四版 248页例8.11
*/
#include<stdio.h>
int main()
{
//总结:
//1.有&的都是地址(有一个[]的是行首地址,有两个[]是n行m列元素地址)
//2.有一个*都是n行0列元素地址
//3.有两个*都是n行m列元素值
//4.有一个[]的是n行0列的地址
//5.有两个[]的是n行m列元素值
//6.a+n是n行首地址
//例子:
//1. &a[0]:0行首地址;
// &a[0][0]:0行0列元素地址
//2. * a:0行0列元素地址
// * (a+1):1行0列地址
//3.* (* (a+1)+0):1行0列元素值
//4. a[0]:0行0列元素地址
//5.a[0][0]:0行0列元素值
//6.a+n:n行首地址
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
printf("0行首地址a:%d,0行0列元素地址* a:%d\n",a,* a);//0行首地址和0行0列元素地址
printf("0行0列元素地址a[0],* (a+0):%d,%d\n",a[0],* (a+0));//0行0列元素地址
printf("0行首地址&a[0]:%d,0行0列元素地址&a[0][0]:%d\n",&a[0],&a[0][0]);//0行首地址和0行0列元素地址
printf("1行0列元素地址a[1]:%d,1行首地址a+1:%d\n",a[1],a+1);//1行0列元素地址和1行首地址
printf("1行0列元素地址&a[1][0],* (a+1)+0:%d,%d\n",&a[1][0],* (a+1)+0);//1行0列元素地址
printf("2行0列元素地址a[2],* (a+2):%d,%d\n",a[2],* (a+2));//2行0列元素地址
printf("2行首地址&a[2],a+2:%d,%d\n",&a[2],a+2);//2行首地址
printf("1行0列元素地址a[1][0],* (* (a+1)+0):%d,%d\n",a[1][0],* (* (a+1)+0));//1行0列元素地址
printf("2行0列元素地址* a[2],* (* (a+2)+0):%d,%d\n",* a[2],* (* (a+2)+0));//2行0列元素地址
return 0;
}
/*Dev-c++输出结果:
0行首地址a:6487584,0行0列元素地址* a:6487584
0行0列元素地址a[0],* (a+0):6487584,6487584
0行首地址&a[0]:6487584,0行0列元素地址&a[0][0]:6487584
1行0列元素地址a[1]:6487600,1行首地址a+1:6487600
1行0列元素地址&a[1][0],* (a+1)+0:6487600,6487600
2行0列元素地址a[2],* (a+2):6487616,6487616
2行首地址&a[2],a+2:6487616,6487616
1行0列元素地址a[1][0],* (* (a+1)+0):9,9
2行0列元素地址* a[2],* (* (a+2)+0):17,17
*/
/* 创建时间:20171230
创建人:fangweijun(773714759@qq.com)
功能:有一个3*4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值(指针)
位置:C程序设计(第四版)2010年6月第四版 249页例8.12
*/
#include<stdio.h>
int main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int * p;
for(p=a[0];p<a[0]+12;p++)
{
if((p-a[0])%4==0)//p-a[0]两个元素之间的个数,这行代码的意思是每4个元素换行
printf("\n");
printf("%4d",* p);
}
printf("\n");
return 0;
}
/*Dev-c++输出结果:
1 3 5 7
9 11 13 15
17 19 21 23
*/
/* 创建时间:20171230
创建人:fangweijun(773714759@qq.com)
功能:输出二维数组任一行任一列元素的值(指针)
位置:C程序设计(第四版)2010年6月第四版 251页例8.13
*/
#include<stdio.h>
int 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=a;
printf("please enter row and colum:");
scanf("%d,%d",&i,&j);
printf("a[%d,%d]=%d\n",i,j,* (* (p+i)+j)); //数组i行j列元素的值
return 0;
}
/*Dev-c++输出结果:
please enter row and colum:1,2
a[1,2]=13
*/
/* 创建时间:20171230
创建人:fangweijun(773714759@qq.com)
功能:有一个班,3个学生,各学4门课,计算总平均分数以及第n个学生的成绩(指针)
位置:C程序设计(第四版)2010年6月第四版 252页例8.14
*/
#include<stdio.h>
int main()
{
void average(float * p,int n);
void search(float (* p)[4],int n);
float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
average( * score,12);//传递0行0列元素地址
search(score,2);//传递0行首地址 ,求序号为2和学生成绩
return 0;
}
void average(float * p,int n)//定义求平均成绩的函数
{
float * p_end;
float sum=0,aver;
p_end=p+n-1;
for(;p<=p_end;p++)
sum=sum+(* p);
aver=sum/n;
printf("average=%5.2f\n",aver);
}
void search(float (* p)[4],int n)//p是指向具有4个元素的一维数组的指针
{
int i;
printf("The score of NO.%d are:\n",n);
for(i=0;i<4;i++)
printf("%5.2f ",* (* (p+n)+i));//输出n行i列的值
printf("\n");
}
/*Dev-c++输出结果:
average=82.25
The score of NO.2 are:
90.00 99.00 100.00 98.00
*/
/* 创建时间:20171230
创建人:fangweijun(773714759@qq.com)
功能:有一个班,3个学生,各学4门课,计算总平均分数以及第n个学生的成绩(指针)
查找有一门以上课程不及格的学生,输出他们的全部课程的成绩
位置:C程序设计(第四版)2010年6月第四版 254页例8.15
*/
#include<stdio.h>
int main()
{
void average(float * p,int n);
void search(float (* p)[4],int n);
void searchlow(float (* p)[4],int n);
float score[3][4]={{65,57,70,60},{80,48,35,81},{90,99,100,98}};
average( * score,12);//传递0行0列元素地址
search(score,2);//传递0行首地址 ,求序号为2和学生成绩
searchlow(score,3);
return 0;
}
void average(float * p,int n)//定义求平均成绩的函数
{
float * p_end;
float sum=0,aver;
p_end=p+n-1;
for(;p<=p_end;p++)
sum=sum+(* p);
aver=sum/n;
printf("average=%5.2f\n",aver);
}
void search(float (* p)[4],int n)//p是指向具有4个元素的一维数组的指针
{
int i;
printf("The score of NO.%d are:\n",n);
for(i=0;i<4;i++)
printf("%5.2f ",* (* (p+n)+i));//输出n行i列的值
printf("\n");
}
void searchlow(float (* p)[4],int n)//定义查找有一门不及格学生,并输出全部课程成绩的函数
{
int i,j,flag;
for(j=0;j<n;j++)//n个学生
{
flag=0;
for(i=0;i<4;i++)//4门成绩
if(* (* (p+j)+i)<60)
flag=1;
if(flag==1)
{
printf("NO.%d fails,his scores are:\n",j+1);
for(i=0;i<4;i++)
printf("%5.1f",* (* (p+j)+i));//输出这个学生的全部成绩
printf("\n");
}
}
}
/*Dev-c++输出结果:
average=73.58
The score of NO.2 are:
90.00 99.00 100.00 98.00
NO.1 fails,his scores are:
65.0 57.0 70.0 60.0
NO.2 fails,his scores are:
80.0 48.0 35.0 81.0
*/