字符 字符串 字符數組 字符串指針 指針數組(C語言)


一、字符指針、字符數組

1. 字符指針:字符串指針變量本身是一個變量,用於存放字符串的首地址。而字符串本身是存放在以該首地址為首的一塊連續的內存空間中並以‘\0’作為串的結束。

        char *ps="C Language";      順序是:1.分配內存給字符指針;2.分配內存給字符串;3.將字符串首地址賦值給字符指針;

        可以寫為:

        char *ps;  #ps字符串指針,是指針,是一個變量,

        ps="C Language"; #ps為字符串的首地址,利用ps++可遍歷字符串,字符串存儲在以ps為開始地址的地段連續的內存空間中,並以'\0'作為字符串的結束。

這里有兩點需要注意:

①定義字符指針char *a中,*a只是指向一個字符。舉例如下:

#include<stdio.h>
int main(){
char *a= "bcd" ;
printf("輸出字符:%c\n",*a); //輸出字符
printf("輸出字符:%c\n",*(a+1)); //輸出字符/
printf("輸出字符串:%s\n",a); //輸出字符串
}

運行結果如下:

 

 

 ②若字符串常量出現在在表達式中,代表的值為該字符串常量的第一個字符的地址。

char *a;  a="hello";

這里字符串"hello"僅僅代表其第一個字符的地址。

2. 字符數組:字符數組是由於若干個數組元素(一個個字符)組成的,它可用來存放整個字符串。(即用字符數組來存放字符串)。

                  在c語言中,將字符串作為字符數組來處理。(c++中不是)

                  字符數組初始化的方法:

                            1).  可以用字符串常量來初始化字符數組:char  str[]={"Iamhappy"};   //可以省略花括號

                                                                                               char  str[]="Iamhappy";      //系統自動加入‘\0’

                            注意:上述這種字符數組的整體賦值只能在字符數組初始化時使用,不能用於字符數組的賦值,字符數組的賦值只能對其元素一一賦值。

                            下面的兩種賦值方法都是錯誤的:

                             char str[20];

                             str="Iamhappy";  

                             對字符數組的各元素逐個賦值:

                             char str[20]

                             str[8]={'I','','a','m','',‘h’,'a','p','p','y'};

在C語言中,可以用兩種方法表示和存放字符串:

(1)用字符數組存放一個字符串
       char str[]="IloveChina";
(2)用字符指針指向一個字符串
       char *str="IloveChina";

兩種表示方式的字符串輸出都用:printf(“%s\n”, str);

%s表示輸出一個字符串,給出字符指針變量名str(對於第一種表示方法,字符數組名即是字符數組的首地址,與第二種中的指針意義是一致的),

則系統先輸出它所指向的一個字符,然后使str自動加1,使之指向下一個字符...,如此,直到遇到字符串結束標識符"\0"。

二、(字符串)指針數組

#include <stdio.h>

void main()

{

char *str[] = {"Hello", "C++", "World"};

int i;

for(i=0; i<3; i++)

   printf("%s\n", str[i]);

}

#include <stdio.h>
int main(){
char *str[] = {"hellow","C++","World"};
printf("%s,%s,%s\n",str[0],str[0]+1,*str);
printf("%c,%s,%c,%c,%s\n",**str,*str+2,*str[2],**(str+2),*(str+2));
}

運行結果為:

其中,str[i]為數組中第i+1個字符串的首地址,*str為數組第一個字符串的首地址,也即數組第一個字符串的第一個字符的地址,*str+i為數組第一個字符串中第i+1個字符的地址,

str[i]+j為數組第i個字符串中第j+1個字符的地址,str[k]=*(str+k)為數組中第k+1個字符串的首地址。

 或

#include <stdio.h>

int main()
{
char *str[] = {"Hello", "C++", "World"};
char **p;
p=str;
printf("%c,%c\n",*p[0],*(p[2]+1));
for(; p<str+3; p++)
printf("%s\n",*p);
}

運行結果為:

其中,p為char類型指向指針的指針,第一個指針p包含了第二個指針*p的地址,第二個指針*p指向包含實際值的位置。

p[i]找到字符數組中第i+1個字符串,並指向第i+1個字符串的首地址;*p[i]做取值操作,p[i]+j為數組第i個字符串中第j+1個字符的地址。

       總的來說,對於char *a[],a是數組,數組中的元素是指針,指向char類型,(數組里面所有的元素是連續的內存存放的);

數組名是數組第一個字節的內存地址,並且數組名a也表示指針。所以a 並不表示a地址存儲的內容, 而是a地址本身。

a+1 表示數組第二個字符串的地址;
*(a+1) 則表示a這個數組的第二個字符串的首地址 (是個char 類型的指針);
*(*(a+1)) 則表示a這個數組的第二個字符串首地址(char指針)所指向的內容,即數組第二個字符串中的第一個字符;
char * a[10] 表示限定這個數組最多可存放10個字符串(char指針)。

三、

char *argv:理解為字符串
char **argv:理解為字符串指針
char *argv[]:字符串指針數組
 
1. 當char []作為函數的參數時, 表示 char *。當作為函數的參數傳入時, 實際上是拷貝了數組的第一個元素的地址;
    所以 void test (char a[]) 等同於 void test ( char * a );
    char x[10];然后調用 test(x) 則等同於把 x 的第一個元素的地址賦予給參數 a;
2. char * a 和 char a[] 
相同點 : a都是指針,  指向char類型.
不同點 : char a[] 把內容存放於棧中, char *a 則把指針存放在棧,把內容存放在內存中 。
3. char * a[10] 和 char a[10][20]
相同點 : a 都是2級指針,*a 表示一級指針, **a 表示內存中存儲的內容。
不同點 :  char * a[10], 數組由char * 類型的指針組成,限定這個數組最多可存放10個元素(char指針)
               char a [10][20] 表示有10行、20列元素的矩陣,值存放地是一塊連續的內存區域, 沒有指針。
4. 小竅門 :  []和*的數量對應, 如 char a[][]的指針層數是2, 相當於char **a; char *a[]也是如此。
兩層指針迷糊的時候數數到底有幾個*幾個[], 就知道什么情況下存儲的是內容還是地址了。 如char a[][] 的情況里面: &a, a, *a 都是地址, **a 是內容.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM