C語言——通過指標如何操作字串——儲存和運算
阿新 • • 發佈:2019-01-28
1.兩種字串的引用方式
第一種:定義一個字元陣列,將字串放在字元陣列中。這樣可以通過下標引用法引用字串中的字元,通過陣列名輸出該字串。
#include<stdio.h>
int main(void)
{
char a[]="I love China!";
printf("%s\n",a);//輸出字串
printf("%c\n",a[7]);//輸出字串的字元'C'
return 0;
}
第二中:定義一個字串指標。
#include<stdio.h>
int main(void)
{
char * a="I love China!" ;
printf("%s\n",a);//輸出字串
printf("%c\n",*(a+7));//輸出字串的字元'C'
return 0;
}
以上兩種方法看似一樣,沒什麼區別,但是不然:
【1】賦值方式是有區別的:字元指標是變數,可以對其賦值;而陣列名是常量,不能對其賦值,只能在定義的時候對個元素賦初值。
char * a="I love China!";
等價於
char * a;
a="I love China!";//合法!!!
char a[]="I love China!";
不等價於
char a[];
a="I love China!" ;//不合法!!!
a[1]='I';//合法!!!
【2】字元陣列由多個元素組成的,每個元素存放一個字元;字元指標變數存放的是地址,是字串第一個元素的地址,不是將字串放在字元指標變數中。
【3】指標變數的值是可以改變的,而陣列名是一個常量(陣列首元素的地址)不能被改變。
【4】應用指標操作字串,必須在操作之前將被操作的字串首地址賦給該指標變數。
2.字元指標變數作為函式的引數
問:如何把一個字串從一個函式傳遞到另一個函式呢?
答:可以用地址傳遞的辦法:字串陣列名做引數或者字串指標變數做引數。
【1】字串陣列名做引數
#include<stdio.h>
int main(void )
{
viod copystring(char c[],char d[])
char a[]="I love China!";
char b[]="You are a man!";
printf("%s\n",a);
printf("%s\n",b);
return 0;
}
viod copystring(char c[],char d[])
{
int i=0;
while(c[i]!='\0')//while(c[i]);因為'\0'的ASCII程式碼為0
{
d[i]=c[i];
i++;
}
d[i]='\0';
}
【2】字串指標變數做形參和實參
#include<stdio.h>
int main(void)
{
viod copystring(char * c ,char * d )
char * a[]="I love China!";
char * b[]="You are a man!";
printf("%s\n",a);
printf("%s\n",b);
return 0;
}
viod copystring(char * c ,char * d )
{
for(;*c!='\0';c++,d++)
{*d=*c;}
*d='\0';
}
【3】關於函式 viod copystring(cha * c ,char * d ) 還可寫的更精煉,這就是字元指標的強大,真的很神奇。
(1)
viod copystring(char * c ,char * d )
{
while((*d=*c)!='\0')
{d++;c++;}
}
(2)
viod copystring(char * c ,char * d )
{
while((*d++=*c++)!='\0');
}
因為,*的優先順序比++高,即先做結合再右結合,即先將*c的值*d,再c和d自加,指標正向下一個地址。
(3)
viod copystring(char * c ,char * d )
{
while((*c!='\0')
{
*d++=*c++;
*d='\0';
}
}
(4)
viod copystring(char * c ,char * d )
{
while(*c)
{
*d++=*c++;
*d='\0';
}
}
(5)最神奇的事來了!!!
viod copystring(char * c ,char * d )
{
while(* d++=* c++); //程式碼簡潔而大方!!!
}
(6)同理
viod copystring(char * c ,char * d )
{
for(;(* d++=* c++)!=0;);); //等價於for(;*d++=*c++;);
}
(7)
viod copystring(char * c ,char * d )
{
char *p1,*p2;
p1=c;p2=d;
while((*p2++=*p1++)!='\0');
}