本期話題:字串文字常量,指標,引用
1、關於字串文字常量
sizeof("bohr") == 5
字串文字常量的型別是「適當個數的const字元的陣列」,所以"bohr"的型別就是const char[5]
下面的賦值是可以的:char* p = "bohr";因為在c/c++原來的定義裡,字串文字常量的型別就是char*
字串文字常量是靜態分配的,他們被分配在程式的靜態資料區,所以讓函式返回字串文字常量是安全的。
[code = c/c++]
const char* test()
[/code]
兩個相同的字串文字常量是否被分配在一起,取決於編譯器實現。
[code = c/c++]
const char* p = "test";
const char* q = "test";
if (p == q) cont<<"one!/n"; // 結果隨編譯器而不同
[/code]
為使程式簡潔,可以將長字串分開書寫,下面的書寫方式也是正確的:
[code = c/c++]
char alpha = "abcdefgh"
"ijklmn";
[/code]
2、常量在定義時必須進行初始化
[code = c/c++]
const int num = 100; // ok
const int x; // wrong!
[/code]
3、常量指標和指標常量
[code = c/c++]
char* const cp; // 指向char的const指標
char const* cp; // 指向const char的指標
const char* cp; // 指向const char的指標
[/code]
可以這樣理解:*代表指標,按照自右向左的順序閱讀。
cp is a const pointer to char
cp is a pointer to char const
cp is a pointer to const char
char const和const char是一樣的。
4、不能將常量的位址賦給乙個未加限制的指標
[code = c/c++]
const int c = 2;
int* pi = &c; // 錯誤:用const int* 來對int* 進行初始化
*pi = 3; // 這樣,就造成來常量c的值可以被修改
[/code]
5、引用
引用的最明顯的(也是最簡單和最自然的)一種實現方式是作為乙個常量指標,每次使用它的時候都自動做間接訪問。所以:
[code = c/c++]
int ii = 0;
int& rr = ii;
rr++; // 是對ii加1,而不是將rr指向下乙個位置
int* pp = &rr; // pp指向的是ii
[/code]
一些情況下,引用可以通過編譯器的優化而去掉,使得在執行時根本不存在任何表示引用的東西。
引用在使用時必須初始化,對普通的t& 的初始式必須使用乙個型別t的左值。左值是乙個物件,可以取得它的位址。
[code = c/c++]
double& dr = 1; // 錯誤:要求左值
[/code]
但是,const t& 的初始式不必是左值
[code = c/c++]
const double& cdr = 1; // ok
[/code]
這相當於
[code = c/c++]
double temp = double(1); // 首先建立乙個具有正確值的臨時變數
const double& cdr = temp; // 用臨時變數作為引用的初始式
[/code]
C 學習筆記(二)
在學習最新的c 標準過程中會碰到很多新問題,這些問題有時候很難理解為什麼會發生。更奇怪的是,似乎跟開發工具有關。如下面這個在vs2005下的例子 word istatus ifstream ifs if i it szprlfile,0 0 std locale global std locale ...
C 學習筆記二
chapter22 滾動字幕程式 1.ondraw函式中寫畫得內容.使用invalidate 或者 invalidaterect 重新整理 觸發ondraw 得呼叫.2.windows不允許直接 訪問顯示硬體 我們必須通過和視窗 關聯得 裝置環境 跟顯示硬體 通訊 裝置環境由c 得cdc類 物件表示...
C 學習筆記(二)
if expression exprsssion必須為bool值 checked和unchecked操作符用於整數算術運算時控制當前環境中的溢位檢查。下列運算參與了check和unchecked檢查 switch case語言 不容許遍歷 foreach 語句 預編譯指令 異常處理 類的宣告 類的宣...