1. 程式人生 > >C語言——通過指標如何操作字串——儲存和運算

C語言——通過指標如何操作字串——儲存和運算

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 * aa="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');
}