關於Char *a與Char a[]中變數佔用空間的大小(Windows 7 32位)
阿新 • • 發佈:2019-01-05
去面試時幾家公司很愛在char *和char []上做文章,很基礎也容易犯錯。面試題裡很喜歡折騰這些內容,在這裡簡單的做個比較。
如果有錯誤,請指正。
1、Test 1
//字元陣列大小未指定大小,指標變數運算元沒有型別
#include <iostream> int main() { using namespace std; char a[]=" hello world\n"; char *b=" hello world\n"; cout<<"size of array = "<<; cout<<" bytes.\n"; cout<<"size of pointer = "<<sizeof b; cout<<" bytes.\n"; return 0; }
當字元陣列未指定大小時,陣列佔用的空間其實就是陣列內字元所佔用的空間,一個字元一個位元組。注意“hello”前面的空格,陣列結尾還有一個“\o”,所以sizeof a的結果是14個位元組。
只要是求指標的大小的時候,它的值都是4,不管指標定義的型別。
圖:
2、Test 2
//字元陣列大小指定,指標變數運算元有型別
#include <iostream> int main() { using namespace std; char a[20]=" hello world\n"; char *b=" hello world\n"; cout<<"size of array = "<<sizeof a; cout<<" bytes.\n"; cout<<"size of pointer = "<<sizeof *b; cout<<" bytes.\n"; return 0; }
當字元陣列指定大小時,陣列佔用的空間就是它指定大小。char a[]指定的大小是20,所以它佔用的空間就是20位元組。
若指標變數前有型別時,其結果等於1。*可以理解為一個地址型別,b才存放著另外一個變數的地址。
圖:
3、Test 3
//換種方式
#include <iostream> using namespace std; void countsize(char a[]) { cout<< sizeof a ; } int main() { char a[20]=" hello world\n"; char *b=" hello world\n"; cout<<"size of array = "; coutsize(a); cout<<" bytes.\n"; cout<<"size of pointer = "<<sizeof b; cout<<" bytes.\n"; return 0; }
之前在Test 1中main函式sizeof a得到的是14,用coutsize函式輸出的結果會是多少呢?結果是4,會吃驚嗎?其實coutsize(char a[])與coutsize(char *a)是一樣的,它是不會為你記錄陣列的大小,而是傳入了地址引數。
圖: