1. 程式人生 > >關於Char *a與Char a[]中變數佔用空間的大小(Windows 7 32位)

關於Char *a與Char a[]中變數佔用空間的大小(Windows 7 32位)

去面試時幾家公司很愛在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)是一樣的,它是不會為你記錄陣列的大小,而是傳入了地址引數。

圖: