sizeof與strlen 遞迴優化題解

2022-02-23 01:59:04 字數 2511 閱讀 4914

sizeof是c/c++中的乙個操作符(operator),確切的說是乙個編譯時運算子,引數可以是陣列、指標、型別、物件、函式等。用於統計型別或者變數所佔的記憶體位元組數。由於在編譯時計算,因此sizeof不能用來返回動態分配的記憶體空間的大小。

是c標準庫中的字串函式,要在執行時才能計算。引數必須是字元型指標(char*), 且必須是以'\0'結尾的。它的功能是:返回字串的長度。該字串可能是自己定義的,也可能是記憶體中隨機的,該函式實際完成的功能是從代表該字串的第乙個位址開始遍歷,直到遇到結束符'\0'。返回的長度大小不包括'\0'。

1、char *str = "hello";

strlen(str); //它的值是5,因為hello這個字串有5個字元

sizeof(str); //它的值是4,因為char *是乙個指標型別,它佔4個位元組。

sizeof("hello"); //它的值是5,是因為hello有5個字元,每乙個字元佔1個位元組。

2、int a[2] = ;

sizeof(a); //它的值是8,因為a中有2個int型變數,每個int型佔4個位元組,所以8位元組

strlen(a) //a相當於乙個指標,但是strlen只能接受char*型別,所以編譯時出錯

3、char arr[10] = "hello";

intlen_one = strlen(arr);

int len_two = sizeof(arr); 

cout << len_one << " and " << len_two

<< endl; 

輸出結果為:5 and 10

strlen只關心儲存的資料內容,不關心空間的大小和型別。 

sizeof返回定義arr陣列時,編譯器為其分配的陣列空間大小,不關心裡面存了多少資料(10x1)。    

4、char * parr = new char[10];

int len_one = strlen(parr);

int len_two = sizeof(parr);

int len_three = sizeof(*parr);

cout << len_one <<

" and " << len_two << " and " <<

len_three << endl;

輸出結果:3 and 4 and 1

第乙個輸出結果3實際上每次執行可能不一樣,這取決於parr裡面存了什麼(從parr[0]開始直到遇到第乙個'\0'結束);

第二個結果實際上本意是想計算parr所指向的動態記憶體空間的大小,但是事與願違,sizeof認為parr是個字元指標,因此返回的是該指標所佔的空間(指標的儲存用的是長整型,所以為4)

第三個結果,由於*parr所代表的是parr所指的位址空間存放的字元,所以長度為1。

面試題:定義乙個空的資料型別,裡面沒有任何成員變數和成員函式,對該型別求sizeof,得到的結果是多少?

答案:是1,為什麼不是0?空型別的例項中不包含任何資訊,本來求sizeof應該是0,但是當我們宣告該型別的例項時,它必須在記憶體中占有一定的空間,否則無法使用這些例項(也就不能求sizeof了),至於占用多少記憶體,由編譯器決定,visual studio中每個空型別的例項占用1位元組的空間。

擴充套件1:如果在該型別中新增乙個建構函式和析構函式,再求sizeof,得到的結果是多少?

答案:還是1。呼叫建構函式和析構函式只需要知道函式的位址即可,而這些位址只與型別相關,而與型別的例項無關,編譯器也不會因為這兩個函式而在例項內新增任何額外的資訊。

注:不管新增的是建構函式還是析構函式還是其它任何型別的函式,都是這個結果。

擴充套件2:那如果把析構函式標記為虛函式呢?

答案:c++的編譯器一旦發現乙個型別中有虛函式,就會為該型別生成虛函式表,並在該型別的每乙個例項中新增乙個指向虛函式表的指標,在32位機器上,乙個指標佔4位元組空間,因此求sizeof得到4;如果是64位則為8。

測試用例:

#include struct

nulltype ;

struct

type1

~type1() {}

int print()

};struct

type2

virtual ~type2() {}

};int

main()

**的優化,給出下一段**,請做出最好的優化

int f(int

n) }

解答

無非是將遞迴轉化為迴圈,防止重複計算中間值,跟斐波那契數列f(n)=f(n-1)+f(n-2)一樣,解決方式也一樣,就是利用幾個臨時變數儲存中間值,然後每次迴圈都更新臨時變數即可。過程沒啥好說的,直接給出**即可。

int f2(int

n)

return

fourth;

}

sizeof 與 strlen 的區別

一 示例 eg1 下列 char buffer 256 char pbuffer buffer cout sizeof buffer cout sizeof pbuffer 其執行結果為 eg2 簡單說明 sizeof gives the amount of storage,in bytes,ass...

strlen與sizeof的區別

1.sizeof操作符的結果型別是size t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。2.sizeof是算符,strlen是函式。3.sizeof可以用型別做引數,strlen只能用char 做引數,且必須是以 0 結尾的。4....

sizeof與strlen的區別

sizeof 表示式 是c c 關鍵字 不是函式 功能 返回 表示式 結果所佔機器 位元組 的大小。strlen 字串 是c c 標準庫的函式 不是關鍵字 在標頭檔案 string.h 中宣告。功能 計算 字串 中的 0 之前的字元個數。特別注意 strlen總是假定傳給它的引數是以null結束符 ...