【c和指針學習筆記】深入理解字符串常量

思考下列表達式代表什麼意思???
//1:“zyh_helen”+ 1
//2: *“zyh_helen”
//3:“zyh_helen”[2]。


如果你覺得上述表達式不瞭解,甚至認爲他們看上去像垃圾的話,你有必要閱讀本篇文章
首先對“字符串常量”這個話題進行深入的討論:
當一個字符串常量出現在表達式中時,他的值是一個指針常量編譯器把這些指定字符的一份拷貝存儲在內存中的某個位置,並存儲一個指向第一個字符的指針。
你可能會聯想到,當數組名用於表達式中時,他們的值也是指針常量(例如:int a[10],a++ ++a --a a--都是不合法的),但是我們可以對他們進行下標引用、間接訪問以及指針運算。這些操作對於字符串常量是否也有意義呢?

答案是肯定的,如下所示:
1:“zyh_helen”+ 1  ,字符串出現在表達式中時,他的值是一個指針常量,指向字符串中的第一個字符(知道字符串常量實際是一個常量指針,該問題就迎刃而解了)-->“指針加1”,結果仍是一個指針,它指向字符串中的第2個字符。
2:*“zyh_helen”,對指針進行間接訪問操作,其結果就是指針所指的內容,字符串常量的類型是“指向字符的指針”,結果即爲它所指向的字符‘z’
3:“zyh_helen”[2],該表達式的值即爲字符:‘h’

你可能會問起,人們什麼時候會使用上面這些形式的表達式呢?下面的例子是一個很好的解釋

已下程序實現:無符號十進制數轉化爲16進制,並且打印出來
方式一:
void int_to_hex1(unsigned int n)
{
	char array[8];
	int count = 0;
	while (n)
	{
		array[count++] = n % 16;
		n >>= 4;
	}
	for (int i = count - 1; i >= 0; --i)
	{
		if (array[i] <= 9)
			printf("%d", array[i]);
		else
			cout << array[i]-10+'A';
	}
	cout << endl;
}

方式二:
void int_to_hex3(unsigned int n)
{
	char array[8];//32位二進制--->8位16進制(最多需要)
	int count = 0;
	while (n)
	{
		array[count++] = "0123456789ABCDEF"[n % 16];
		n >>= 4;
	}
	for (int i = count - 1; i >= 0; --i)
	{
		cout << array[i];
	}
	cout << endl;
}
顯然方式一得代碼比較複雜,因爲字母和數字在字符集中並不是相鄰的,方式二定義了一個字符串,使子母和數字相鄰,從而避免了這種複雜性,餘數將在字符串中選擇一個正確的數字。
方式二比傳統的方式要快,因爲它所需要的操作更少,但是,它的代碼並不一定比原來的方法更小,雖然指令減少了,但它付出的代價是多了一個17個字節(‘\0’不要忽略了)的代價。

下面例子也是字符串常量的一個應用:(統計一個十進制數:二進制表示中1的個數)
int count(int num)
{
	int count = 0;
	while (num)
	{
		count += "\0\1\1\2\1\2\2\3\1\2\2\3\2\3\3\4"[num % 16];
		num >>= 4;
	}
	return count;
}
每次取num的後四位,判斷有多少個1(4位表示的數值:0--15,0到15,二進制中1的個數分別爲0 1 1 2 1 2 2 3 1 2 2 3 2 3 3 4 )‘\’的作用:轉移字符,將字符轉化爲數字




發佈了133 篇原創文章 · 獲贊 86 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章