//指針是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);
}
}