最近老感覺自己的身體一天不如一天,老是丟三落四的, 哎,歲月啊..................
在此給還在被中國教育的童鞋們一個建議.............在學校的時候還是小玩玩游戲,小談談一些海闊天空的事,當你工作後,你會發現你
不但沒有時間這個本錢了, 同時連身體這個本錢也沒有了..........
上次說了一些有意思的面試題, 今天我們結著看看一些關於指針和sizeof的面試題:
下面是我看到的一些面試題
5、簡述
char * const p;
char const *p;
const char *p;
之間的區別。
首先討論:
char * const p; 這裡可以知道const修飾是指針變量p; 因此指針p的指向不能改變,這樣的變量
定義必須首先初始化,否則將不能編譯通過。但是p指向的變量的存儲內容可以改變。
Exp:
char chTest1;
char chTest2;
char * const p=&chTest1;
// p=&chTest2; 這個地方是錯誤的,不能這樣賦值
*p=‘c’;
chTest1=‘b’;
接下來討論:
char const *p; 這裡可以知道const修飾的是*p; 因此可以知道不能通過*p指向來改變變量的值; 但是
指針p的指向可以改變,而且可以通過原變量進行改變值。
Exp:
char chTest1;
char chTest2;
char const *p=&chTest1;
p=&chTest2;
chTest=‘a’;
這裡可以知道: 1)p的指向可以改變
2)不能通過*p= 某個值進行賦值
3)指針指向的變量的值自己可以改變。
最後討論:
const char *p=&chTest1; 這裡可以知道const修飾的是*p; 因此這個與char const *p;具有相同的效果。
Exp:
char chTest1;
char chTest2;
const char *p=&chTest1;
p=&chTest2;
chTest1=a;
// *p=a; 這個地方錯誤, 不能這樣修改值。
總結:
修飾符僅對其修飾的對象起作用,對別的變量不起作用。
6、以下代碼中的兩個sizeof用法有問題嗎?
void UpperCase( char str[] ) // 將 str 中的小寫字母轉換成大寫字母
{
for( size_t i=0; i <sizeof(str)/sizeof(str[0]); ++i )
if( a <=str[i] && str[i] <=z )
str[i] -= (a-A );
}
char str[] = "aBcDe";
cout < < "str字符長度為: " < < sizeof(str)/sizeof(str[0]) < < endl;
UpperCase( str );
cout < < str < < endl;
Exp:
這個問題的考察點是sizeof的用法。那麼我們應該如何看待這個問題呢?
1、這裡首先我們需要知道的是sizeof 是個運算符, 它具有運算的優先級別, 那麼sizeof運算的優先級在什麼地方呢?
可以查看運算符優先級的定義: sizeof 的優先級和 *p(P為指針)、&p(變量,取地址)的優先級一樣, 排在優先級的第二位。
2、其次要明白sizeof關鍵字的作用
sizeof 關鍵字返回的是操作數在內存中占用的字節數。
這裡要看sizeof操作符的操作對象:
1) 類型關鍵字
sizeof(int): 這個取決系統的定義, 當在32位機器上時; sizeof int == 4
而在16位機器上時, sizeof int == 2
2) 變量
int iTest;
sizeof iTest; 這樣返回的是這種變量類型在內存中所占用的空間。
即:
sizeof iTest == sizeof int;
3) 字符串字面值
sizeof "abcd";
那麼返回的是:字符串在