C++指針和數(shù)組:字符和字符串、字符數(shù)組的關(guān)聯(lián)和區(qū)別
字符串的本質(zhì)就是字符數(shù)組,將字符串作為字符數(shù)組來處理。字符數(shù)組和字符串都可以作為存放字符的數(shù)組,所以可以通過數(shù)組的下標(biāo)訪問每一個(gè)字符。字符串比較正如在C++中可以用3種方法(字符數(shù)組、字符串(類)、字符指針)訪問一個(gè)字符串,比較字符串(內(nèi)容)自然也有這三種基本形式。
字符串是一種重要的數(shù)據(jù)類型,但是c語(yǔ)言并沒有顯示的字符串?dāng)?shù)據(jù)類型,因?yàn)樽址宰址A康男问匠霈F(xiàn)或者存儲(chǔ)于字符數(shù)組中。在C++標(biāo)準(zhǔn)模板庫(kù)(STL)中提供了string類,實(shí)現(xiàn)了對(duì)字符串的封裝。但是其實(shí)現(xiàn)原理還是居于字符和指針,要了解這個(gè)原理,我們先看一下有關(guān)字符數(shù)組、字符和字符串之間的一些關(guān)聯(lián)。
區(qū)別:字符數(shù)組的長(zhǎng)度就是字符的總長(zhǎng)度,而字符串會(huì)+1,是因?yàn)榘俗詈蟮?ldquo;\0”結(jié)束符。
一、字符指針、字符數(shù)組
字符指針
字符串指針變量本身是一個(gè)變量,用于存放字符串的首地址。而字符串本身是存放在以該首地址為首的一塊連續(xù)的內(nèi)存空間中并以 \0 作為串的結(jié)束。
char *ps="C Language";
順序是:1.分配內(nèi)存給字符指針;2.分配內(nèi)存給字符串;3.將字符串首地址賦值給字符指針;
char *ps; // ps 字符串指針,是指針,是一個(gè)變量
ps="C Language"; // ps 為字符串的首地址,利用 ps++ 可遍歷字符串,字符串存儲(chǔ)在以 ps 為開始地址的地段連續(xù)的內(nèi)存空間中,并以 \0 作為字符串的結(jié)束。
這里有兩點(diǎn)需要考慮清楚的地方:
1、*a 只是指向一個(gè)字符。
舉例如下:
#include <stdio.h> #include <stdlib.h> int main(void){ char *a= "bcd" ; printf("輸出字符:%c \n", *a); /*輸出字符,使用"%c"*/ printf("輸出字符:%c \n", *(a+1) ); /*輸出字符,使用"%c"*/ printf("輸出字符串:%s \n", a); /*輸出字符串,使用"%s";而且a之前不能有星號(hào)"*" */ system("pause"); /*為了能看到輸出結(jié)果*/ }
運(yùn)行結(jié)果如下:
輸出字符:b 輸出字符:c 輸出字符串:bcd
2、若字符串常量出現(xiàn)在在表達(dá)式中,代表的值為該字符串常量的第一個(gè)字符的地址。所以 hello 僅僅代表的是其地址。原聲明方式相當(dāng)于以下聲明方式:
char *a; a="hello"; /*這里字符串"hello"僅僅代表其第一個(gè)字符的地址*/
字符數(shù)組
字符數(shù)組是由于若干個(gè)數(shù)組元素組成的,它可用來存放整個(gè)字符串。(即用字符數(shù)組來存放字符串)。
在 C 語(yǔ)言中,將字符串作為字符數(shù)組來處理。(C++中不是)
字符數(shù)組初始化的方法:
1). 可以用字符串常量來初始化字符數(shù)組:
char str[]={"Iamhappy"};
可以省略花括號(hào)
char str[]="Iamhappy"; # 系統(tǒng)自動(dòng)加入 \0
注意:上述這種字符數(shù)組的整體賦值只能在字符數(shù)組初始化時(shí)使用,不能用于字符數(shù)組的賦值,字符數(shù)組的賦值只能對(duì)其元素一一賦值。
下面的賦值方法是錯(cuò)誤的:
char str[20]; str="Iamhappy";
對(duì)字符數(shù)組的各元素逐個(gè)賦值。
char str[10]={'I','','a','m','','h','a','p','p','y'};
在 C 語(yǔ)言中,可以用兩種方法表示和存放字符串:
(1)用字符數(shù)組存放一個(gè)字符串
char str[]="IloveChina";
(2)用字符指針指向一個(gè)字符串
char *str="IloveChina";
兩種表示方式的字符串輸出都用:printf("%s\n", str);
%s 表示輸出一個(gè)字符串,給出字符指針變量名 str(對(duì)于第一種表示方法,字符數(shù)組名即是字符數(shù)組的首地址,與第二種中的指針意義是一致的),則系統(tǒng)先輸出它所指向的一個(gè)字符數(shù)據(jù),然后自動(dòng)使 str 自動(dòng)加 1,使之指向下一個(gè)字符...,如此,直到遇到字符串結(jié)束標(biāo)識(shí)符 \0 。
二、字符串指針
string* str 可以賦值:
string* str = {"hello", "world"}; // 對(duì)比與 char *name = "wang" = {'w','a','n','g'} // *(str) = "hello", *(str+1) = "world" // *(*(str)+1) = 'e'
也就是說每個(gè)元素都是 string 類型的,跟 char* 是不一樣的,不過 string* 可以用 char** 來代替:
string = char*, string* = char**
三、(字符串)指針數(shù)組
實(shí)例
#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"第二個(gè)字符'e'的地址,str[2]=str+2:第三個(gè)字符串"world"的首地址 // str[1]字符串"C++"的首地址 // str[2]字符串"world"的首地址
或
實(shí)例
#include <stdio.h> #include <string.h> int main() { char *str[] = {"Hello", "C++", "World"}; char **p; for(p=str; p<str+3; p++) puts(*p); #*p為字符串首地址,*p[0]為字符串的第一個(gè)字符地址 }
或
實(shí)例
#include<stdio.h> #include<stdlib.h> int main() { char *str[3]={"Hello","C++","World"}; printf("%s,%s,%c",str[0],str[0]+1,*(*(str+2)+1)); system("pause"); }
結(jié)果為:
Hello,ello,o
格式:char* na[N] = {"li", "zh", "li", "zh", "li"};
char *a[]:表示a是數(shù)組,數(shù)組中的元素是指針,指向char類型,(數(shù)組里面所有的元素是連續(xù)的內(nèi)存存放的) 數(shù)組名是數(shù)組第一個(gè)字節(jié)的內(nèi)存地址,并且數(shù)組名a也表示指針。所以a 并不表示a地址存儲(chǔ)的內(nèi)容, 而是a地址本身。
a+1:表示 a 的第二個(gè)元素的內(nèi)存地址, 所以是加 8 字節(jié)。( 因?yàn)閍的元素是char 指針, 所需要的空間為8字節(jié)(64位內(nèi)存地址)。 )
*(a+1):則表示a這個(gè)數(shù)組的第二個(gè)元素的內(nèi)容 (是個(gè)char 類型的指針,本例表示為world字符串的地址)。
*(*(a+1)):則表示a這個(gè)數(shù)組的第二個(gè)元素的內(nèi)容(char指針)所指向的內(nèi)容(w字符).
char * a[10]:表示限定這個(gè)數(shù)組最多可存放10個(gè)元素(char指針), 也就是說這個(gè)數(shù)組占用10*8 = 80字節(jié)。
#w: a+1 => *(a+1) => *(a+1)[0] 指針(地址) 指針內(nèi)容(字符串) 字符
四、總結(jié)
char *argv:理解為字符串 char **argv:理解為字符串指針 char *argv[]:字符串指針數(shù)組
int main(int argc, char*argv[]) 這是一個(gè)典型的數(shù)組名(或者說是指針數(shù)組)做函數(shù)參數(shù)的例子,而且還是沒有指定大小的形參數(shù)組。
有時(shí)為了再被調(diào)用函數(shù)中處理數(shù)組元素的需要,可以另設(shè)一個(gè)形參,傳遞需要處理的數(shù)組元素的個(gè)數(shù)。而且用數(shù)組名做函數(shù)實(shí)參時(shí),不是吧數(shù)組元素的值傳遞給形參,而是把實(shí)參數(shù)組的首元素的地址傳遞給形參數(shù)組,這樣兩個(gè)數(shù)組久共同占有同一內(nèi)存單元。 和變量作函數(shù)參數(shù)的作用不一樣。
可以去看看關(guān)于數(shù)組作為函數(shù)參數(shù)和指針數(shù)組作main函數(shù)形參方面的例子。譚浩強(qiáng)的那本書講的很細(xì),對(duì)這個(gè)有詳細(xì)的解釋。
1. 當(dāng) char [] 作為函數(shù)的參數(shù)時(shí), 表示 char *. 當(dāng)作為函數(shù)的參數(shù)傳入時(shí), 實(shí)際上是拷貝了數(shù)組的第一個(gè)元素的地址。
所以 void test (char a[]) 等同于 void test ( char * a )
char x[10] ;
然后調(diào)用 test(x) 則等同于把 x 的第一個(gè)元素的地址賦予給參數(shù) a。
2. char * a 和 char a[]
- 相同點(diǎn) : a都是指針, 指向char類型。
- 不同點(diǎn) : char a[] 把內(nèi)容存在stack。char *a 則把指針存在 stack,把內(nèi)容存在 constants。
3. char * a[10] 和 char a[10][20]
- 相同點(diǎn) : a 都是2級(jí)指針, *a 表示一級(jí)指針, **a 表示內(nèi)存中存儲(chǔ)的內(nèi)容。
- 不同點(diǎn) : char * a[10], 數(shù)組由char * 類型的指針組成; char a [10][20] 表示一位放10個(gè)元素, 二維放20個(gè)元素, 值存放地是一塊連續(xù)的內(nèi)存區(qū)域, 沒有指針。
4. 小竅門 : [] 和 * 的數(shù)量對(duì)應(yīng), 如 char a[][] 的指針層數(shù)是 2, 相當(dāng)于 char **a; char *a[] 也是如此, 兩層指針. 迷糊的時(shí)候數(shù)數(shù)到底有幾個(gè) * 幾個(gè) [], 就知道什么情況下存儲(chǔ)的是內(nèi)容還是地址了 ? 如 char a[][] 的情況里面: &a, a, *a 都是地址, **a 是內(nèi)容。
到此這篇關(guān)于C++指針和數(shù)組:字符和字符串、字符數(shù)組的關(guān)聯(lián)和區(qū)別的文章就介紹到這了,更多相關(guān)C++字符和字符串、字符數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++11新特性中auto 和 decltype 區(qū)別和聯(lián)系
這篇文章主要介紹了C++11新特性中auto 和 decltype 區(qū)別和聯(lián)系的相關(guān)資料,需要的朋友可以參考下2017-01-01C語(yǔ)言基礎(chǔ)應(yīng)用處理學(xué)生打分?計(jì)算時(shí)間?最少硬幣問題詳細(xì)過程
很多的問題其實(shí)可以用編程來解決作答,本篇文章帶你用C語(yǔ)言解決最少硬幣問題、計(jì)算已經(jīng)過去了多久、學(xué)生成績(jī)自動(dòng)打分來做基礎(chǔ)的訓(xùn)練2022-02-02c++將字符串轉(zhuǎn)數(shù)字的實(shí)例方法
在本篇文章里小編給大家整理的是關(guān)于c++將字符串轉(zhuǎn)數(shù)字的實(shí)例方法,有需要的朋友們可以參考下。2020-02-02C++?AVL樹插入新節(jié)點(diǎn)后的四種調(diào)整情況梳理介紹
AVL樹是高度平衡的而二叉樹,它的特點(diǎn)是AVL樹中任何節(jié)點(diǎn)的兩個(gè)子樹的高度最大差別為1,本文主要給大家介紹了C++如何實(shí)現(xiàn)AVL樹,需要的朋友可以參考下2022-08-08C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解下篇浮點(diǎn)型在內(nèi)存中的存取
使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么2022-04-04