//指针是C语言的精髓,只有掌握好指针才算是真正学会了C语言,以下就是学习指针的例子
#include<stdio.h>
main()
{
void sort(char *name[],int n);
void print(char *name[],int n);
int strcmp1(char *str1,char *str2);
int strcmp2(char *str1,char *str2);
static char *name[]={"CHINW","CHINP","FRANC",
"FRANCE","GERMANY"};
int n=5;
sort(name,n);
print(name,n);
if(strcmp1(name[0],name[1])>0)
printf("%s,%s/n",name[0],name[1]);
if(strcmp1(name[2],name[3])<0)
printf("%s,%s/n",name[2],name[3]);
printf("That is ok!/n");
getch();
return 0;
}
int strcmp1(char *str1,char *str2)
{
char **p1,**p2; //定义两个指向指针的指针的变量,可理解为地址的地址变量
int f=0;
p1=&str1; //给地址的变量赋待比较的字符串的地址值
p2=&str2;
for(;f==0&&(**p1!='/0'||**p2!='/0');(*p1)++,(*p2)++)//循环判断字符串的操作
{
if(**p1<**p2)//比较每个字符的大小
f=-1;
else if(**p1>**p2)
f=1;
else f=0;
}
return f;
}
/*
本功能是比较字符串大小的函数,该函数运用指针实现,原因是指针可以直接管理内存,
此外减少对存储空间的开销,因为指针之间指向实参,而不用重新为传过来的形参进行
空间的开销。
现在说明该函数模块的每个语句含义和作用:函数的参数是字符或字符串的指针(地址),
实参可以是数组指针表示的字符串,也可以仅仅是字符串,总的来说都是字符串。一旦传值给
形参的字符串指针变量,该变量指向的是整个字符串的首地址,也可以说是第一个字符的地址,
即指针变量是一个字符的地址。
根据上面的思路,char **p1,**p2定义了两个指向地址的地址的变量,用于替代传进来的
字符串便于操作,p1=&str1表示把字符串的首地址赋值给指向指针的指针的变量,这下也应该知道
p1表示是地址了。在for语句中出现的**p1!='/0'意思是:取出变量的地址里的值,首先是*(*p1)
括号表示取出变量p1指向的地址值,然后外边的”*“再取出地址对于存储的值,这时是值是字符。
如果只是用*p1='/0'的话,那么它只是表示地址的值,而它的值是不会为空的;但是后面必须用
(*p1)++语句,因为(*p1)表示字符串中的一个字符的地址,括号加上"++"意思指向下一个字符,
如果用P++或*p++语句,那么它只是表示地址值简单的加 1 而已,而不是整型或字符型的一个地址值,
即不表示下一个元素。对于if语句中的意思和**p1!='/0'是一样的。
*/
int strcmp2(char *str1,char *str2)
{
int f=0;
for(;f==0&&(*str1!='/0'||*str2!='/0');str1++,str2++)//字符指针变量完成for语句的操作
{
if(*str1<*str2)//比较单个字符的大小
f=-1;
else if(*str1>*str2)
f=1;
else f=0;
}
return f;
}
/*
str1字符指针变量表示字符串的单个字符的地址,后面加上”++"表示指向下一个元素,用下一个地址值
表示。*str1取出地址的值即单个字符。
*/
void sort(char *name[],int n)
{
int i,j,k;
char *pt;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(strcmp2(name[k],name[j])>0)
k=j;
if(k!=i)
{
pt=name[i];
name[i]=name[k];
name[k]=pt;
}
}
}
void print(char *name[],int n)
{
int i;
char **p;
char *format;
format="%s/n";
for(i=0;i<n;i++)
{
p=name+i;
printf(format,*p);
}
}