晚上幫wl做些阿里的面試題,遇到乙個關於字串常量和字串變數的問題,感覺有些不確定,就回來研究一下。
首先看個例子吧:char *p="hello";p[2]='j'; 這裡有問題嗎?既然這樣問了,肯定有噻。
這裡普及下我之前沒注意的事實:char *p="hello"得到的是字串常量;char p="hello"得到的是字串變數。事實上,字串常量都放在乙個稱之為文字常量區的神奇地方。
我們看個**吧:
#include using猜猜結果是什麼?namespace
std;
int j=3
;char *a="
lihuan";
char *b="
lihuan";
char e="
lihuan";
char f="
lihuan";
intmain()
我們可以發現,a和b指向同乙個地方,而e和f指向的地方不一樣,且和a、b的地方也不一樣。而j、e、f的位址是挨著的。其實,a和b指向的就是文字常量區,而j、e、f都在靜態儲存區(因為他們都是全域性變數)。
這裡普及乙個知識:
乙個程式的執行起來後,其在記憶體中有5個區域
1. 程式**區
這個很簡單,**要執行,肯定要載入進記憶體, 我們不必關心。
2. 文字常量區
一般我們這樣定義乙個字串時,其是在文字常量區的:
char* s1 = "hello, world";
char* s2 = "hello, world";
這裡, s1和s2指向的是同乙個字串
文字常量區儲存的都是常量,常量一經初始化,就不允許被修改
3. 靜態儲存區
全域性變數,靜態變數會放在這個區域,事實上,全域性變數也是靜態的。
4. 棧
區域性變數就是在棧裡的。另外,函式呼叫時的引數也是在棧裡的,這個現在不必關心
5. 堆
malloc或new出來的記憶體就是在堆裡的,需要程式設計師自己管理清除。
順便聊一下指標常量與常量指標的區別吧:
1.常量指標:
在c/c++中,常量指標是這樣宣告的:
1)const int *p;
2)int const *p;
常量指標的使用要注意,指標指向的物件不能通過這個指標來修改,可是仍然可以通過原來的宣告修改,也就是說常量指標可以被賦值為變數的位址,之所以叫做常量指標,是限制了通過這個指標修改變數的值。例如:
int a = 5;
const int *c = &a; // 這是合法的,非法的是對c的使用
*c = 6; // 非法,但可以這樣修改c指向的物件的值:a = 6;
2.指標常量:
在c/c++中,指標常量這樣宣告:
int a;
int *const b = &a; //const放在指標宣告操作符的右側
因為指標常量是乙個常量,在宣告的時候一定要給它賦初始值。一旦賦值,以後這個常量再也不能指向別的位址。
雖然指標常量的值不能變,可是它指向的物件是可變的,因為我們並沒有限制它指向的物件是常量。
char *a = "abcde1234";
char *const c = &a;
下面的操作是可以的。
a[0] = 'x'; // 我們並沒有限制a為常量指標(指向常量的指標)
3.指向常量的指標常量:
在c/c++中,這麼宣告:
const int a = 25;
const int * const b = &a;
看,指標宣告操作符左邊有乙個const,說明宣告的是乙個指向常量的指標。再看,指標宣告操作符右邊有乙個const,說明宣告的是乙個指標常量。前後都鎖死了,那麼指向的物件不能變,指標常量本身也不能變。
由 引發的思考
前陣子在乙個移動專案中,通過 的方式 繫結click 事件來提交乙個表單,由於表單資訊比較敏感,於是採用的post 同步提交的方式,原本到也沒有什麼。後來萬惡的pm說 你這個按鈕呀,要固定在底部比較好 於是乎就通過 position fixed 固定到底部了。那麼,問題來了 在ios 下,虛擬鍵盤是...
由XML Literal引發的思考
首先,什麼是xml literal呢?原來,這是在vb.net 9.0才引入的乙個用於構建xml物件的新特性,並且只有vb.net 9.0才支援。我們都知道,要建立xml樹,可以使用linq中的api,如下所示 出自vb.net 9.0 xml literal dim xml2 new xeleme...
由html,body引發的思考
預設情況下,html body 除ie6 是沒有高度,但body有margin 在上圖中ie8,ie9,chrome,ff一樣 當僅僅給body設定height 100 時 html未設定height 沒有什麼改變,除了ie6,因為ie6中html預設100 當給html,body都設定height...