C說話中sizeof()與strlen()函數的應用入門及比較。本站提示廣大學習愛好者:(C說話中sizeof()與strlen()函數的應用入門及比較)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話中sizeof()與strlen()函數的應用入門及比較正文
sizeof()函數
1,是甚麼?
sizeof其實就是一個運算符,和那些+,-一樣的器械,在法式編譯的時刻停止解析轉換。固然我們常常見到sizeof前面隨著個小括號,長得和函數差不多,但它和函數完整是兩回事。
2,有甚麼用?
sizeof其實就是用於告知我們編譯器在為某一特定命據或許某種數據類型的數據在存儲空間中開拓空間時,開拓的空間年夜小,以字節為單元。
3,怎樣用?
sizeof(類型),或許sizeof(變量)都可以,獲得的就是類型或許變量的存儲空間。當對變量用的時刻,也能夠沒有括號,直接 sizeof 變量,但普通不消(我普通都是只記一種通用的用法……)。
4,用的時刻要留意甚麼?
(1)sizeof前往的占用空間年夜小是為這個變量開拓的年夜小,而不只是它用到的空間。和當今住房的修建面積和適用面積的概念差不多。所以對構造體用的時刻,年夜多情形下就得斟酌字節對齊的成績了。
(2)對位域成員等連編譯器都沒法肯定存儲空間的器械不克不及用。這個應當比擬好懂得,由於sizeof前往的都是以字節為單元的數據,你讓它去求那些以位為單元的年夜小,這不是居心難為編譯器嘛。所以編譯器采取的計劃是同一不受理,即便你說你恰好是8位,占一個字節,編譯器也不睬你。
(3)sizeof前往的數據類型是unsigned int。由於C中分歧類型數據混雜運算時的主動轉換,有時刻不留意的話能夠會出成績,詳細可以參照上面的法式例子。
(4)要留意數組名和指針變量的差別。平日情形下,我們總認為數組名和指針變量差不多,然則在用sizeof的時刻差異很年夜,對數組名用sizeof前往的是全部數組的年夜小,而對指針變量停止操作的時刻前往的則是指針變量自己所占無暇間,在32位機的前提下普通都是4。並且當數組名作為函數參數時,在函數外部,形參也就是個指針,所以不再前往數組的年夜小。
5,實例剖析
源碼:
#include<stdio.h> int main() { int iVal = 3; printf("The size of type int is %d \n", sizeof(int)); printf("The size of iVal is %d\n", sizeof(iVal)); printf("The size of iVal is %d\n", sizeof iVal); if((iVal - sizeof(int)) < 0) { printf("The return type is int\n"); } else { printf("The return type is unsigned int\n"); } char chArrayCon[7]; char *chp; chp = chArrayCon; printf("The size of chArrayCon is %d, The size of chp is %d\n", sizeof(chArrayCon), sizeof(chp)); int iArraySize = 3; char chArrayVar[iArraySize]; printf("The size of chArrayVar is %d\n", sizeof(chArrayVar)); return 0; }
運轉成果:
The size of type int is 4 The size of iVal is 4 The size of iVal is 4 The return type is unsigned int The size of chArrayCon is 7, The size of chp is 4 The size of chArrayVar is 3
成果剖析:
代碼第一部門重要就是簡略的表現了一下用法。
第二部門解釋了留意事項的第三項。按說,iVal的值是3,減4的話應當是-1,小於0,輸入的應當是"he return type is int"。然則因為當int和unsigned int一路運算時,會默許釀成unsigned int,所以成果會是一個很年夜的unsigned int類型的數,是年夜於0的。
代碼第三部門就簡略解釋了數組名和指針變量的差別,即便你把指針變量指向數組名,編譯器仍然可以或許分辯出差別。
以上講述的都沒有斟酌在C99尺度下的情形。由於在C99尺度下有種特別情形,那就是不定長數組的應用。當對不定長數組名應用sizeof的話,前往的也是全部數組的年夜小,就像實例中第四塊代碼一樣。然則這其實不是在編譯階段履行的,而是在法式運轉階段履行的。由於在編譯的時刻,編譯器普通不曉得變量的值是若干。(固然例子中我直接賦值3,能夠不便利懂得,可以設想iArraySize是經由過程scanf來取得現實數值的,然後再聲明數組的)。關於這類情形,現實中運用的其實不多,年夜家可以當作特別情形看待便可,或許直接疏忽失落也行……
6總結
其實sizeof的感化就是告知我們分派給變量的“修建面積”的年夜小,只需記得這一點應當就夠了,不論這個變量類型是通俗的整型數據,照樣構造體,共用體,列舉……記住這一點後,當我們再去想曉得sizeof對分歧數據類型操作前往的值究竟是甚麼的時刻,只需弄明確那些數據類型究竟要消費若干“修建面積”便可以啦!
strlen()函數
C庫函數 size_t strlen(const char *str) 盤算字符串str的長度,但不包含終止空字符。
聲明
以下是聲明的strlen() 函數。
size_t strlen(const char *str)
參數
str -- 這是字符串的長度要盤算的。
前往值
這個函數前往字符串的長度。
例子
上面的例子顯示應用strlen() 函數。
#include <stdio.h> #include <string.h> int main () { char str[50]; int len; strcpy(str, "This is yiibai.com"); len = strlen(str); printf("Length of |%s| is |%d| ", str, len); return(0); }
讓我們編譯和運轉下面的法式,這將發生以下成果:
Length of |This is yiibai.com| is |26|
sizeof與strlen的用法差別
1. sizeof操作符的成果類型是size_t,它在頭文件中typedef為unsigned int類型。該類型包管能包容完成所樹立的最年夜對象的字節年夜小。
2. sizeof是運算符(C++ 症結字),strlen是函數。
3. sizeof可以用類型做參數,strlen只能用char*做參數,且必需是以”\0”開頭的。sizeof還可以用函數做參數,好比:
short f(); printf("%d\n", sizeof(f()));
輸入的成果是前往值的類型的年夜小, 即sizeof(short)=2。
4. 數組做sizeof的參數不退步,傳遞給strlen就退步為指針了。年夜部門編譯法式在編譯的時刻就把sizeof盤算過了,是類型或是變量的長度,這就是sizeof(x)可以用來界說數組維數的緣由。
char str[20]="0123456789"; int a=strlen(str); //a=10; int b=sizeof(str); //b=20;
而strlen的成果要在運轉的時刻能力盤算出來,是用來盤算字符串的長度,不是類型占內存的年夜小。
5. sizeof後假如是類型必需加括弧,假如是變量名可以不加括弧。這是由於sizeof是個操作符不是個函數。
6. 當實用了於一個構造類型時或變量, sizeof 前往現實的年夜小,當實用一靜態地空間數組, sizeof 獲得全體數組的尺寸。sizeof 操作符不克不及前往靜態地被分配了的數組或內部的數組的尺寸。
7. 數組作為參數傳給函數時傳的是指針而不是數組,傳遞的是數組的首地址,如:
fun(char [8]) fun(char [])
都等價於 fun(char *)。
在C++裡參數傳遞數組永久都是傳遞指向數組首元素的指針,編譯器不曉得數組的年夜小。假如想在函數內曉得數組的年夜小, 須要如許做:
進入函數後用memcpy拷貝出來,長度由另外一個形參傳出來
fun(unsiged char *p1, int len) { unsigned char* buf = new unsigned char[len+1] memcpy(buf, p1, len); }
sizeof對指針的話,成果是響應的類型:
char* ss = "0123456789"; sizeof(ss)
成果是4 => ss是指向字符串常量的字符指針,sizeof 取得的是一個指針的之所占的空間,應當是長整型的,所所以4. sizeof(*ss) 成果 1, => *ss是第一個字符,其實就是取得了字符串的第一名“0” 所占的內存空間,是char類型的,占了1個字節,strlen(ss)= 10 >>>> 假如要取得這個字符串的長度,則必定要應用 strlen.