指针:
*是取指;&是地址
如:pointer=&a; &*pointer等价于&a,&和*优先级相同,遵循自右向左结合。
*&pointer等价于a;
*(p+i)+j:表示i行j列的地址; *(*(p+j)+j):表示的是i行j列的数值;
输入两个数,由大到小输出:
#include<stdio.h>
void main()
{
void exchange(int *x,int *y);
int a,b;
int *x,*y;
x=&a;
y=&b;
printf("please input the numbers:\n");
scanf("%d%d",&a,&b);
if(a<b)
{
exchange(x,y);
}
printf(" %d > %d \n",a,b);
}
void exchange(int *x,int *y)
{
int z;
if(*x<*y)
{
z=*x;
*x=*y;
*y=z;
}
}
输入a,b,c三个数,按由大到小的顺序输出;
#include<stdio.h> //方法一
void main()
{
void exchange(int *x,int *y);
int a,b,c;
int *x,*y,*z;
x=&a;
y=&b;
z=&c;
printf("please input the numbers:\n");
scanf("%d%d%d",&a,&b,&c);
if(a<b)
{
exchange(x,y);
}
if(a<c)
{
exchange(x,z);
}
if(b<c)
{
exchange(y,z);
}
printf(" %d > %d > %d \n",a,b,c);
}
void exchange(int *x,int *y)
{
int z;
if(*x<*y)
{
z=*x;
*x=*y;
*y=z;
}
}
#include<stdio.h> //方法二
void main()
{
void exchange(int *x,int *y,int *z);
int a,b,c;
int *x,*y,*z;
x=&a;
y=&b;
z=&c;
printf("please input the numbers:\n");
scanf("%d%d%d",&a,&b,&c);
exchange(x,y,z);
printf(" %d > %d > %d \n",a,b,c);
}
void exchange(int *x,int *y,int *z)
{
int temp;
if(*x<*y)
{
temp=*x;
*x=*y;
*y=temp;
}
if(*x<*z)
{
temp=*x;
*x=*z;
*z=temp;
}
if(*y<*z)
{
temp=*y;
*y=*z;
*z=temp;
}
}
#include<stdio.h> //方法三
void main()
{
void exchange(int *x,int *y,int *z);
void swap(int * w,int *u);
int a,b,c;
int *x,*y,*z;
x=&a;
y=&b;
z=&c;
printf("please input the numbers:\n");
scanf("%d%d%d",&a,&b,&c);
exchange(x,y,z);
printf(" %d > %d > %d \n",a,b,c);
}
void exchange(int *x,int *y,int *z)
{
if(*x<*y)
{
swap(x,y);
}
if(*x<*z)
{
swap(x,z);
}
if(*y<*z)
{
swap(y,z);
}
}
void swap(int *w,int *u)
{
int temp;
temp=*w;
*w=*u;
*u=temp;
}
定义一个数组a[10]={9,8,7,6,5,4,3,2,1,0},输出在这个数组
数组a[],其中a就表示数组的首地址;
#include<stdio.h> //定义指针P输出
void main()
{
int a[10]={9,8,7,6,5,4,3,2,1,0};
int *p;
int i;
p=&a[0];
for(i=0;i<10;i++)
{
printf("%d ",*(p+i));
}
}
#include<stdio.h> //用数组的原始定义输出
void main()
{
int a[10]={9,8,7,6,5,4,3,2,1,0};
int *p;
int i;
for(i=0;i<10;i++)
{
printf("%d ",*(a+i));
}
}
将a[10]={0,1,2,3,4,5,6,7,8,9}倒过来存储并输出
#include<stdio.h> //方法一
void main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
int *p;
int i;
p=&a[9];
for(i=0;i<10;i++)
{
printf("%d ",*(p-i));
}
}
#include<stdio.h> //方法二
void main()
{
void exchange(int *x,int n); //指针做形参
int a[10]={0,1,2,3,4,5,6,7,8,9};
int i;
exchange(a,10);
for(i=0;i<10;i++)
{
printf("%d ",*(a+i));
}
}
void exchange(int *x,int n)
{
int temp;
int m,i,j;
m=n/2;
for(i=0;i<m;i++)
{
j=n-1-i;
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
}
输入一组数组,求出最大值和最小值。
#include<stdio.h>
void main()
{
void find(int *x,int n);
int a[10]={1,22,45,13,87,6,8,12,98,4};
int i;
find(a,10);
printf("max=%d min=%d\n",a[0],a[9]);
}
void find(int *x,int n)
{
int temp;
int i,j;
for(i=0;i<9;i++) //冒泡排序法
{
for(j=0;j<9-i;j++)
{
if(x[j]<x[j+1])
{
temp=x[j];
x[j]=x[j+1];
x[j+1]=temp;
}
}
}
}
有一组数组,从键盘输入行和列,打印出对应的数字。
#include<stdio.h>
void main()
{
int a[3][4]={{1,22,45,13},{87,6,8,12},{98,4,8,9}};
int x,y;
int *p;
printf("please input the hang x=,lie y=\n");
scanf("%d%d",&x,&y);
p=&a[x][y];
printf("%d\n",*p);
}
打印一个字符串
#include<stdio.h>
void main()
{
char string[]="I love China!";
printf("%s\n",string);
}
#include<stdio.h>
void main()
{
char *string="I love China!";
printf("%s\n",string);
}
将字符串A复制给字符串B
#include<stdio.h>
void main()
{
char *string="I love China!",b[30];
int *p1,*p2;
int i;
p1=string;
p2=b;
for(;*p1!='\0';p1++,p2++)
{
*p2=*p1;
}
*p2='\0';
printf("the string a = %s\n",string);
printf("the string b = ");
for(i=0;b[i]!='\0';i++)
{
printf("%c",b[i]);
}
printf("\n");
}
#include<stdio.h> //用字符数组作为参数传递
void main()
{
void copy(char x[],char y[]);
char a[]="I love China!";
char b[]="I love my wife!";
printf("the string a is:%s\n",a);
printf("the string b is:%s\n",b);
printf("then copy b to a :\n");
copy(a,b);
printf("the string a is:%s\n",a);
printf("the string b is:%s\n",b);
}
void copy(char x[],char y[])
{
int i=0;
while(y[i]!='\0')
{
x[i]=y[i];
i++;
}
x[i]='\0';
}
#include<stdio.h> //以指针为参数传递
void main()
{
void copy(char *x,char *y);
char a[]="I love China!"; //a数组要被写,所以不能定义为指针,否则在执行时会报错
char *b="I love my wife!";
printf("the string a is:%s\n",a);
printf("the string b is:%s\n",b);
printf("then copy b to a :\n");
copy(a,b);
printf("the string a is:%s\n",a);
printf("the string b is:%s\n",b);
}
void copy(char *x,char *y)
{
int i=0;
for(;*y!='\0';*x++,*y++)
{
*x=*y;
}
*x='\0';
}
输入a,b两个数,第一次调用函数process时求出两者的最大值,第二次调用时求出最小值,第三次调用时求和。
#include<stdio.h>
void main()
{
int max(int,int);
int min(int,int);
int add(int,int);
void process(int,int,int(*p)());
int a,b;
printf("please input the number:\n");
scanf("%d%d",&a,&b);
printf("the max is ");
process(a,b,max);
printf("the min is ");
process(a,b,min);
printf("the add is ");
process(a,b,add);
}
int max(int x,int y)
{
int z;
if(x>y)
{
z=x;
}
else
{
z=y;
}
return(z);
}
int min(int x,int y)
{
int u;
if(x<y)
{
u=x;
}
else
{
u=y;
}
return(u);
}
int add(int x,int y)
{
int w;
w=x+y;
return(w);
}
void process(int x,int y,int(*p)())
{
int i;
if(p==max)
{
i=max(x,y);
}
else if(p==min)
{
i=min(x,y);
}
else
{
i=add(x,y);
}
printf("%d\n",i);
}
一组学生的成绩,每个学生有四门课,找出不及格的科目,并统计学生的学号。
#include<stdio.h>
void main()
{
int a[3][4]={{99,87,65,78},{45,78,89,78},{87,69,45,35}};
void found(double (*pointer)[4]);
found(a);
}
void found(double (*pointer)[4])
{
int i,j,k=0;
int *p;
for (i=0;i<3;i++)
{
p=*(pointer+i);
for(j=0;j<4;j++)
{
if(*(p+j)<60)
{
printf("%d ",*(p+j));
k++;
}
}
if(k!=0)
{
printf("学号%d 不及格的有%d门\n",i,k);
}
k=0;
}
}
将一串字符串按首字母排序。
#include<stdio.h>
#include<string.h>
void main()
{
void sort(char *a[],int n);
void print(char *b[],int m);
char *name[4]={"I love you","I love china","Can you marry me","Yes"};
int n=4;
sort(name,n);
print(name,n);
}
void sort(char *a[],int n)
{
char *temp;
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(strcmp(a[k],a[j])>0)
{
k=j;
}
if(k!=i)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
void print(char *b[],int m)
{
int s;
for(s=0;s<m;s++)
{
printf("%s ",b[s]);
}
}