日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

[cpp] 字符数组,字符指针,sizeof,strlen总结

發(fā)布時(shí)間:2025/5/22 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [cpp] 字符数组,字符指针,sizeof,strlen总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

對(duì)于字符數(shù)組與字符指針:

1. 以字符串形式出現(xiàn)的,編譯器都會(huì)為該字符串自動(dòng)添加一個(gè)0作為結(jié)束符,如在代碼中寫"abc",那么編譯器幫你存儲(chǔ)的是"abc\0".

2. 字符串直接量作為字符指針的初始值?

? "hello"是一個(gè)字符串直接量,編譯器將其作為const char*處理,與之相關(guān)聯(lián)的內(nèi)存空間位于內(nèi)存的只讀部分,即允許編譯器重用指向等價(jià)字符串直接量的引用以優(yōu)化內(nèi)存使用,

即使程序? 中使用了字符串直接量500次,編譯器在內(nèi)存中也只是創(chuàng)建了一個(gè)實(shí)例。例如: char *ptr = “hello”; 等價(jià)于 const char *ptr = “hello”;

字符串直接量"hello"關(guān)聯(lián)的是只讀內(nèi)存,如果試圖修改將出錯(cuò),例如ptr[1] = ‘a(chǎn)’;是會(huì)引起錯(cuò)誤的。

3. 字符串直接量作為基于棧的字符數(shù)組的初始值

??? 由于基于棧的變量不可能引用其他地方存儲(chǔ)的內(nèi)存,編譯器會(huì)負(fù)責(zé)將字符串直接量復(fù)制到基于棧的數(shù)組內(nèi)存中。

??? 例如: char stackArray[] = “hello”;

??? 做如下修改: stackArray[1] = ‘a(chǎn)’;是真確的。

4. 字符數(shù)組與字符指針

??? 字符數(shù)組的形式如下,會(huì)將字符直接量拷貝到棧上:

????????? char str[]?? = "abc";???????????? // 實(shí)際的數(shù)據(jù)存儲(chǔ): a b c \0,也就是增加了一個(gè)終結(jié)符\0

????????? char str[3] = {'a','b','c'};???? // 實(shí)際的數(shù)據(jù)存儲(chǔ): a b c,并沒有在最后添加終結(jié)符

????????? char str[10] = {'a','b','c'};?? // 實(shí)際的數(shù)據(jù)存儲(chǔ): a b c \0 \0 \0 \0 \0 \0 \0

?? 字符指針的形式如下:

????????? char *str = “abc”;?????????????? // 實(shí)際的數(shù)據(jù)存儲(chǔ): a b c \0,也就是增加了一個(gè)終結(jié)符\0

5. 類型的決定

??? 1). 數(shù)組的類型是由該數(shù)組所存放元素的類型以及數(shù)組本身的大小決定的

???????? 如char s1[3]和char s2[4],s1的類型就是char[3],s2的類型就是char[4],也就是說盡管s1和s2都是字符數(shù)組,但兩者的類型卻是不同的。

??? 2). 字符串常量的類型可以理解為相應(yīng)字符常量數(shù)組的類型

???????? 如"abcdef"的類型就可以看成是const char[7],也就是說實(shí)際的數(shù)據(jù)存儲(chǔ)為"abcdef\0"。

??? 3). 函數(shù)參數(shù)列表中的以數(shù)組類型書寫的形式參數(shù),編譯器把其解釋為普通的指針類型

???????? 如對(duì)于void func(char sa[100],int ia[20],char *p),則sa的類型為char*,ia的類型為int*,p的類型為char*。

對(duì)于sizeof與strlen:?

1. sizeof操作符的結(jié)果類型是size_t,它在頭文件中typedef為unsigned int類型。該類型保證能容納實(shí)現(xiàn)所建立的最大對(duì)象的字節(jié)大小。

2. sizeof是算符,strlen是函數(shù)。

3. sizeof可以用類型做參數(shù),strlen只能用char*做參數(shù),且必須是以''\0''結(jié)尾的。

4. 數(shù)組做sizeof的參數(shù)不退化,傳遞給strlen就退化為指針了。

5. 大部分編譯程序在編譯的時(shí)候就把sizeof計(jì)算過了,是類型或是變量的長(zhǎng)度這就是sizeof(x)可以用來定義數(shù)組維數(shù)的原因。
??? char str[20]="0123456789"; // str是編譯期大小已經(jīng)固定的數(shù)組
???? int a=strlen(str); //? a=10; //strlen()在運(yùn)行起確定,計(jì)算的是實(shí)際長(zhǎng)度
???? int b=sizeof(str); //? 而b=20; //sizeof()在編譯期確定,str的類型是int[20],計(jì)算的是占據(jù)內(nèi)存的大小

6. strlen的結(jié)果要在運(yùn)行的時(shí)候才能計(jì)算出來,是用來計(jì)算字符串的實(shí)際長(zhǎng)度,不是類型占內(nèi)存的大小。

7. sizeof后如果是類型必須加括弧,如果是變量名可以不加括弧。這是因?yàn)閟izeof是個(gè)操作符不是個(gè)函數(shù)。
??? char c;
??? sizeof c;? //變量名可以不加括弧
8. 當(dāng)適用于一個(gè)結(jié)構(gòu)類型或變量, sizeof 返回實(shí)際的大小,
??? 當(dāng)適用一靜態(tài)地空間數(shù)組, sizeof 歸還全部數(shù)組的尺寸。
??? sizeof 操作符不能返回動(dòng)態(tài)地被分派了的數(shù)組或外部的數(shù)組的尺寸

sizeof、strlen計(jì)算字符數(shù)組、字符指針空間

char str[] = "abc";?實(shí)際的數(shù)據(jù)存儲(chǔ): a b c \0,也就是增加了一個(gè)終結(jié)符\0其類型為char[4]? VS: sizeof(str)=4???? strlen(str) = 3
GCC: sizeof(str)=4???? strlen(str) = 3
char str[]?? = "abc";實(shí)際的數(shù)據(jù)存儲(chǔ): a b c \0,也就是增加了一個(gè)終結(jié)符\0其類型為char[4]? VS: sizeof(str)=4???? strlen(str) = 3
GCC: sizeof(str)=4???? strlen(str) = 3
char str[] = {'a','b','c'};實(shí)際的數(shù)據(jù)存儲(chǔ): a b c,并沒有在最后添加終結(jié)符其類型為char[3]? VS: sizeof(str)=3???? strlen(str) = 15
GCC: sizeof(str)=3???? strlen(str) = 6
char str[3] = {'a','b','c'};實(shí)際的數(shù)據(jù)存儲(chǔ): a b c,并沒有在最后添加終結(jié)符其類型為char[3]? VS: sizeof(str)=3???? strlen(str) = 15
GCC: sizeof(str)=3???? strlen(str) = 6
char str[5] = {'a','b','c','d','e'};?實(shí)際的數(shù)據(jù)存儲(chǔ): a b c d e ,并沒有在最后添加終結(jié)符其類型為char[5]? VS: sizeof(str)=5???? strlen(str) = 19
GCC: sizeof(str)=5???? strlen(str) = 8
char str[5] = {'a','b','c','d'};實(shí)際的數(shù)據(jù)存儲(chǔ): a b c d \0(默認(rèn)填充字符\0)其類型為char[5]? VS: sizeof(str)=5???? strlen(str) = 4
GCC: sizeof(str)=5???? strlen(str) = 4
char *pstr = "abcde";實(shí)際的數(shù)據(jù)存儲(chǔ): a b c d e \0pstr的類型為char*sizeof(pstr) = 4 ( 指針的數(shù)據(jù)存儲(chǔ)空間,4個(gè)字節(jié)),strlen(pstr) = 5

總結(jié)一下:

1). sizeof的結(jié)果是類型的大小,區(qū)分類型之后,sizeof的結(jié)果也就命了,sizeof的結(jié)果是在編譯期決定的,計(jì)算的占據(jù)的內(nèi)存大小。

???? srelen的結(jié)果是在運(yùn)行期間決定,計(jì)算的是實(shí)際長(zhǎng)度,strlen只能以char*作參數(shù),以\0作為結(jié)束符, 以上的例子中,紅色部分的strlen計(jì)算是錯(cuò)誤的,

???? 因?yàn)樵趕tr的數(shù)據(jù)存儲(chǔ)中并沒有 一個(gè)\0字符,所以strlen的結(jié)果看似有點(diǎn)異常。

2). 注意在計(jì)算sizeof的時(shí)候:

???? char str[] = "abc";? 類型為char[4],?? sizeof(str) = 4*sizeof(char) = 4.

3). sizeof(express),其中的express在編譯過程中是不會(huì)被編譯的,而是被替代類型。

???? 例如: int a = 1; sizeof(a=2);

???? 此時(shí)的express為a=2,在編譯過程中被替換為sizeof(int),所以在執(zhí)行完之后,a仍然是等于1.

4). 對(duì)函數(shù)使用sizeof,在編譯階段會(huì)被替換為函數(shù)的返回值的類型取代

???? 例如: int f(){return 0;}? sizeof(f());的結(jié)果為4.

???????????? void f(){}??????????? sizeof(f());編譯過程中會(huì)出現(xiàn)錯(cuò)誤,替換之后的sizoeof(void)編譯無法通過.

轉(zhuǎn)載于:https://www.cnblogs.com/alex-tech/archive/2011/03/26/1996284.html

總結(jié)

以上是生活随笔為你收集整理的[cpp] 字符数组,字符指针,sizeof,strlen总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。