字符 字符串 字符數組 字符串指針 指針數組

1、字符指針、字符數組c++

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

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

        能夠寫爲:函數

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

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

這裏有兩點須要考慮清楚的地方:①*a只是指向一個字符。舉例以下:內存

1.#include <stdio.h>字符串

2.#include <stdlib.h>string

3.it

4.int main(void){  

5.char *a= "bcd" ;  

6.printf("輸出字符:%c /n", *a);  /*輸出字符,使用"%c"*/<br>    

   printf("輸出字符:%c /n", *(a+1) );  /*輸出字符,使用"%c"*/

7.printf("輸出字符串:%s /n", a); /*輸出字符串,使用"%s";並且a以前不能有星號"*"  */

8.system("pause");  /*爲了能看到輸出結果*/

9.}  

10./*運行結果以下:

11.輸出字符:b<br>輸出字符:c

12.輸出字符串:bcd*/

②若字符串常量出如今在表達式中,表明的值爲該字符串常量的第一個字符的地址。因此」hello」僅僅表明的是其地址。原聲明方式至關於如下聲明方式:

1.char *a;  

2.a="hello";/*這裏字符串"hello"僅僅表明其第一個字符的地址*/

 

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

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

                  字符數組初始化的方法:

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

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

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

                            下面的賦值方法是錯誤的:

                             char str[20];

                             str="Iamhappy";  

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

                             char str[10]={'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"。

2、字符串指針

string* str能夠賦值string* str = {"hello", "world"};//對比與char *name = "wang" = {'w','a','n','g'}
                          //??  *(str) = "hello", *(str+1) = "world"
                          //??  *(*(str)+1) = 'e',
也就是說每一個元素都是string類型的,跟char*是不同的,不過string*能夠用char**來代替//string = char*, string* = char**

 

3、(字符串)指針數組

 
#include <stdio.h>
void main()
{
char *str[] = {"Hello", "C++", "World"};//char (*str)[] = ...
int i;
for(i=0; i<3; i++)
printf("%s\n", str[i]);
} #str[0]字符串「hello」的首地址,str[0]+1:字符串「hello」第二個字符‘e’的地址,str[2]=str+2:第三個字符串「world」的首地址
  #str[1]字符串「C++」的首地址
  #str[2]字符串「world」的首地址


#include <stdio.h>
#include <string.h>
void main()
{
char *str[] = {"Hello", "C++", "World"};
char **p;
for(p=str; p<str+3; p++)
puts(*p); #*p爲字符串首地址,*p[0]爲字符串的第一個字符地址
}
 
#include<stdio.h>
#include<stdlib.h>
main()
{
char *str[3]={"Hello","C++","World"};
printf("%s,%s,%c",str[0],str[0]+1,*(*(str+2)+1));
system("pause");
}
結果爲:
Hello,ello,o


格式:char* na[N] = {"li", "zh", "li", "zh", "li"};

char *a[]:表示a是數組,數組中的元素是指針,指向char類型,(數組裏面全部的元素是連續的內存存放的)

 數組名是數組第一個字節的內存地址,而且數組名a也表示指針。因此a 並不表示a地址存儲的內容, 而是a地址自己。

a+1 表示a的第二個元素的內存地址, 因此是加8字節.( 由於a的元素是char 指針, 所須要的空間爲8字節(64位內存地址). ) 
*(a+1) 則表示a這個數組的第二個元素的內容 (是個char 類型的指針. 本例表示爲world字符串的地址).
*(*(a+1)) 則表示a這個數組的第二個元素的內容(char指針)所指向的內容(w字符).
char * a[10] 表示限定這個數組最多可存放10個元素(char指針), 也就是說這個數組佔用10*8 = 80字節.
#w:        a+1   =>   *(a+1)  =>   *(a+1)[0]
           指針(地址)   指針內容(字符串)      字符
 
4、
char *argv:理解爲字符串
char **argv:理解爲字符串指針
char *argv[]:字符串指針數組

int main(int argc, char*argv[])

這是一個典型的數組名(或者說是指針數組)作函數參數的例子,並且仍是沒有指定大小的形參數組。

有時爲了再被調用函數中處理數組元素的須要,能夠另設一個形參,傳遞須要處理的數組元素的個數。並且用數組名作函數實參時,不是吧數組元素的值傳遞給形參,而是把實參數組的首元素的地址傳遞給形參數組,這樣兩個數組久共同佔有同一內存單元。 和變量做函數參數的做用不同。
能夠去看看關於數組做爲函數參數和指針數組做main函數形參方面的例子。譚浩強的那本書講的很細,對這個有詳細的解釋。

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[] 把內容存在stack . 
              char *a 則把指針存在stack,把內容存在constants. 
3. char * a[10] 和 char a[10][20]
相同點 : a 都是2級指針, *a 表示一級指針, **a 表示內存中存儲的內容.
不一樣點 :  char * a[10], 數組由char * 類型的指針組成; 
               char a [10][20] 表示一位放10個元素, 二維放20個元素, 值存放地是一塊連續的內存區域, 沒有指針.
 
4. 小竅門 :  []和*的數量對應, 如 char a[][]的指針層數是2, 至關於char **a; char *a[]也是如此, 兩層指針. 迷糊的時候數數到底有幾個*幾個[], 就知道什麼狀況下存儲的是內容仍是地址了? 如char a[][] 的狀況裏面: &a, a, *a 都是地址, **a 是內容.
相關文章
相關標籤/搜索