81.用指向指针的指针的方法,对5个字符串排序并输出(指针)
#include <stdio.h>
#include <string.h>
void sort(char **p,int n)
{
int i,j;
char *temp;
for(i=0; i<n-1; i++)
{
for(j=0; j<n-i-1; j++)
if(strcmp(*(p+j),*(p+j+1))>0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
int main()
{
const int N=5;
int i;
char **p,*pstr[N],str[N][20];
for(i=0; i<N; i++)
pstr[i]=str[i];//将第i个字符串的首地址赋予指针数组pstr的第i个元素
for(i=0; i<N; i++)
scanf("%s",pstr[i]);
p=pstr;
printf("排序后:\n");
sort(p,N);
for(i=0; i<N; i++)
{
printf(pstr[i]);
printf("\n");
}
printf("\n");
return 0;
}
运行结果:
82.输出二维数组任一行任一列的元素值(指针)
#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;
scanf("%d %d",&i,&j);
printf("a[%d][%d]=%d\n",i,j,*(*(p+i)+j)); //输出a[i][j]
return 0;
}
运行结果:
83.将字符串a复制为字符串b,然后输出字符串b(指针)
#include <stdio.h>
int main()
{
char a[]="I am a student.",b[20];
int i;
for(i=0; *(a+i)!='\0'; i++) //逐个值进行复制
*(b+i)=*(a+i);
*(b+i)='\0';
printf("%s\n",b);
return 0;
}
#include <stdio.h>
void copy_string(char *from,char *to) //从from传给to
{
while((*to=*from)!='\0')
{
to++;
from++;
}
}
int main()
{
char a[]="I am a student.",b[20],*p1,*p2;
p1=a;
p2=b;
copy_string(p1,p2); //从p1传给p2
printf("%s\n",b);
return 0;
}
运行结果:
84.可变格式输出函数
#include <stdio.h>
int main()
{
int a;
float b;
scanf("%d %f",&a,&b);
char *format; //等同于char format[]="a=%d b=%.2f\n";
format="a=%d b=%.2f\n";
printf(format,a,b);
return 0;
}
运行结果:
85. 通过指针变量访问它所指向的函数
#include <stdio.h>
int max(int a,int b)
{
if(a>b)
return a;
return b;
}
int min(int a,int b)
{
if(a<b)
return a;
return b;
}
int main()
{
int (*p)(int,int); //p为一个指向函数的指针变量
int a=1,b=2,n,c;
scanf("%d",&n);
if(n==1)
p=max; //通过指针变量调用max函数
else if(n==2)
p=min;
c=(*p)(a,b); //p的作用是将函数max的入口地址赋给指针变量p
if(n==1)
printf("max=%d\n",c);
else if(n==2)
printf("min=%d\n",c);
return 0;
}
运行结果:
86.将若干字符串按字母顺序(由小到大)输出(指针数组)
#include <stdio.h>
#include <string.h>
void sort(char *name[],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(name[k],name[j])>0)
k=j;
if(k!=i) //不是移动字符串,而是改变指针数组的各元素的指向
{
temp=name[i];
name[i]=name[k];
name[k]=temp;
}
}
}
void print(char *name[],int n)
{
int i;
for(i=0; i<n; i++)
printf("%s\n",name[i]); //name[i]相当于一个一维数组的地址
}
int main()
{
char *name[]= {"Follow me","BASIC","Great Wall","FORTRAN","Computer Design"};
int n=5; //指针数组,每个元素存放一个地址,相当于一个指针变量
sort(name,n);
print(name,n);
return 0;
}
运行结果:
87. 使用指向指针数据的指针变量
#include <stdio.h>
int main()
{
char *name[]= {"Follow me","BASIC","Great Wall","FORTRAN","Computer Design"};
char **p; //p为指向指针的指针
int i;
for(i=0; i<5; i++)
{
p=name+i; //p先指向name[0]的地址,*p取出name[0]的值
printf("%s\n",*p);
}
return 0;
}
运行结果:
88.用指向指针数据的指针变量输出整形数组各元素的值
#include <stdio.h>
int main()
{
int a[5]= {1,3,5,7,9};
int *num[5]= {&a[0],&a[1],&a[2],&a[3],&a[4]};
int **p,i;
p=num; //p的值为&num[0]
for(i=0; i<5; i++)
{
printf("%d ",**p); //*p为&a[0],**p为a[0]
p++;
}
printf("\n");
return 0;
}
运行结果:
89.指针数组作main函数的形参
#include <stdio.h>
int main(int argc,char *argv[]) //argc代表个数
{
while(argc>1)
{
++argv;
printf("%s\n",*argv); //*argv[]相当于**argv,所以*argv相当于字符串首地址
--argc;
}
return 0;
}
int main(int argc,char *argv[])
//argc是指命令行中参数的个数;argv是一个指向字符串的指针数组
例如:命令行为 dd China Beijing
则 argv[0] file1\0
argv[1] China\0
argv[2] Beijing\0
输出结果为 China
Beijing
操作过程如下:
首先,Windows+R打开DOS,找到工程的运行文件,打开\bin\Debug,下面有exe文件
在DOS中进入Debug,输入:dd China Beijing (其中dd为工程的运行文件)
90.字符数组作main函数形参二
#include <stdio.h>
int main(int argc,char *argv[]) //argc代表个数
{
int sum=0;
while(--argc>0)
sum+=*argv[argc]-'0';
printf("%d\n",sum);
return 0;
}
DOS输入:dd 12 34 56 78
运行结果输出:16(为1+3+5+7=16)
其中:
argv[0] 为 12 ; *argv[0] 为 1
argv[1] 为 34 ; *argv[1] 为 3
argv[2] 为 56 ; *argv[2] 为 5
argv[3] 为 78 ; *argv[3] 为 7