C基礎練習題
記錄看到過的c基礎題目:
#include<iostream> #include<string.h> using namespace std; void arraysize(char arr[]){ printf("the size of arr[] is %d\n", sizeof(arr)); } int main(void){ char tmp[20] = "I love you"; char *str = "I love you"; char* p = tmp; printf("The size of char* is %d\n", sizeof(char *)); arraysize(tmp); printf("The size of char* p=tmp is %d\n", sizeof(p)); printf("The size of char array tmp is %d\n", sizeof(tmp)); printf("strlen of tmp : %d\n", strlen(tmp)); printf("strlen of str %d\n", strlen(str)); return 0; }
數組名在賦值和函數參數傳遞中不能將數組類型傳遞給賦值的指針變量和函數參數,而蛻變成單純的指針。對於p=tmp,指針p就沒有數組的“內涵",僅僅是個char的指針而已。同樣地,數組當作函數參數傳入時,傳入的只是一個指針值,也不具備數組”內涵“了。
在我計算機中運行的結果是8 8 8 20 10 10。說明在我電腦(64位)上char指針大小為8個·字節,數組地址被賦值或傳遞給其他的變量或函數後,不在是數組類型數據性質的東西。
所謂的數組”內涵“就是指針是不是數組這種數據類型。失去”內涵“就是指針已經不能代表數組數據類型了,變成一個單純的指針類型。
這裏要搞清楚sizeof是用來幹什麽的,sizeof是C/C++中的一個操作符(operator),簡單的說其作用就是返回一個對象或者類型所占的內存字節數。返回數據類型所占內存大小啊。
sizeof(1)==sizeof(int)
sizeof(1.1)==sizeof(double)
sizeof(p)==sizeof(char*)
sizeof(str)==sizeof(char*)
sizeof(tmp)==sizeof(tmp)
雖然我們知道數組名是一常量指針,但是別忘了數組也是一種數據類型。所以當p=tmp後,p仍然是char*類型,而不能異想天開“=”就數組數據類型都賦給了p。sizeof就是用來計算數據類型所占的內存大小的操作符,所以sizeof(p)==8。當sizeof(tmp)的時候,就會計算出數組數據類型占內存多少個字節,一算發現占用了20個字節。
在函數中,數組名當作實參傳入函數,傳入的也只是一個單純的指針。我們設計了這樣的程序:
int main(void){
str[]="I love you";
str++;
return 0;
}
上面程序 指定編譯錯的,因為數組名是個常量指針,但是你按下面寫就是正確的。
void fun(char str[]){
str++;
}
int main(void){
str[]="I love you";
fun(str);
}
說明數組名傳遞進去就不在有數組的“味道”了。
strlen是一個函數,而非sizeof那樣是個操作符。他就是計算從當前位置到‘\0‘有多少個字符。sizeof則是計算數據類型占多少內存。是兩個差異迥然的東西。可能產生模糊的事例:
str1[] = "I love you";
sizeof(str1) == 11
strlen(str1)==10
字符數組是一種數據類型,占用10+1(‘\0‘)內存。所以用sizeof(數據類型)=所占內存大小11;而strlen就是一個函數,就是數一下指針當前位置到‘\0‘有多少個字符。確切的說就是字符串的長度,‘\0’是人為加入的控制符,它占內存但是不屬於字符串本身。故I love you字符串長度就為10。
strlen(str1+1)==9,可以很清楚的看出strlen就是一個當前指針到‘\0‘有多少個字符(不包含‘\0‘)。
數組這東西,作為一種數據類型,就會簡單的是一個常數指針+一段內存,指定在編譯上作了處理(我猜的)。
1)sizeof()計算數據類型所占內存大小
2)strlen()計算當前指針位置到‘\0‘有字符(不含‘\0‘)
3)數組是一種數據類型,賦值和函數傳遞不會攜帶數組數據類型這個特征,而是單純的指針。
本人是外行人,自發學習c語言,記錄一下,可能有很多錯誤想法。
C基礎練習題