關於指標的總結:
1.指標含義:
指標其實是乙個用於存放記憶體位址的變數.在記憶體中跟整形沒什麼區別,由於他必須儲存的資料必須能夠唯一標示乙個記憶體單元.所以在32位系統裡面只占用兩個位元組的長度.但是為什麼在宣告乙個指標變數的的時候卻要指定是指向哪一種型別的指標呢(eg: int * pint; float * pfloat;) ? 個人認為是為了方便指標的操作,
因為pint ++ ;會使 指標 的 指向移動 sizeof(int) 位元組大小(32位機器為兩個位元組).而 pfloat ++; 卻會使指標移動 sizeof(float) 位元組大小?,
2.指標宣告:
指向基本型別的指標: int * 變數名;.....
指向結構體的指標: struct mystruct * 變數名;
struct mystruct
int a;
int b;
宣告: struct mystruct * var;
指向函式的指標:12
typedef
int(
*functionname)(variabletype vara,variabletype varb);
/**/
這樣的話 functionname 就成了一種型別;即為: 指向乙個返回值 為int ,引數為兩個variabletype 的函式 的指標 了;
如此一來,我們 便可以想用 基本型別一樣 宣告乙個 functionname 成員了.
只是呼叫 有點不同. eg: functionname fn;
fn = f; /*或者 fn = &f; f為乙個符合functionname 的 函式*/
fn(vara,varb); /*執行函式 f();*/
3.指標操作:
指標可以像其他變數一樣進行基本運算,甚至可以直接將乙個數字賦給指標變數(型別轉換);但是時刻謹記他表示的是乙個位址;稍有偏差便會導致程式出錯.
4.一些細節和補充:
指標與const限定符: (此處不介紹函式型別. 函式型別只是 函式宣告的一種 簡便方式.)
const
限定符和指標結合起來常見的情況有以下幾種。
const int *a;這兩種寫法是一樣的,int const *a;
a
是乙個指向const int
型的指標,a
所指向的記憶體單元不可改寫,所以(*a)++
是不允許的,但a
可以改寫,所以a++
是允許的。
int * const a;
a
是乙個指向int
型的const
指標,*a
是可以改寫的,但a
不允許改寫。
int const * const a;
a
是乙個指向const int
型的const
指標,因此*a
和a
都不允許改寫。
指向非const
變數的指標或者非const
變數的位址可以傳給指向const
變數的指標,編譯器可以做隱式型別轉換,例如:
char c = 'a';但是,指向const char *pc = &c;
const
變數的指標或者const
變數的位址不可以傳給指向非const
變數的指標,以免透過後者意外改寫了前者所指向的記憶體單元,例如對下面的**編譯器會報警告:
const char c = 'a';即使不用char *pc = &c;
const
限定符也能寫出功能正確的程式,但良好的程式設計習慣應該盡可能多地使用const
,因為:
const
給讀**的人傳達非常有用的資訊。比如乙個函式的引數是const char *
,你在呼叫這個函式時就可以放心地傳給它char *
或const char *
指標,而不必擔心指標所指的記憶體單元被改寫。
盡可能多地使用const
限定符,把不該變的都宣告成唯讀,這樣可以依靠編譯器檢查程式中的bug,防止意外改寫資料。
const
對編譯器優化是乙個有用的提示,編譯器也許會把const
變數優化成常量。
字串字面值通常分配在.rodata
段,而字串字面值類似於陣列名,做右值使用時自動轉換成指向首元素的指標,這種指標應該是const char *
型。我們知道printf
函式原型的第乙個引數是const char *
型,可以把char *
或const char *
指標傳給它,所以下面這些呼叫都是合法的:
const char *p = "abcd";注意上面第一行,如果要定義乙個指標指向字串字面值,這個指標應該是const char str1[5] = "abcd";
char str2[5] = "abcd";
printf(p);
printf(str1);
printf(str2);
printf("abcd");
const char *
型,如果寫成char *p = "abcd";
就不好了,有隱患,例如:
int main(void)
p
指向.rodata
段,不允許改寫,但編譯器不會報錯,在執行時會出現段錯誤。 關於類的this指標總結
this指標其實就是在例項化乙個物件後產生的指標,並且是指向物件本身。也就是說,即使沒有寫上this指標,編譯器在編譯的時候也會加上this指標。它作為非靜態成員函式的隱含形參,對各成員的訪問可以通過this來實現。它的特點可以概括為 1 this只能在成員函式中使用。而在全域性函式或者靜態函式中不...
關於函式指標的總結
函式指標的作用 它主要的用途是轉換表和作為引數傳遞給另乙個函式。舉乙個函式指標宣告的例子 int pf int int 解釋 pf是乙個指向函式的指標,此被指向函式包含兩個int型形參,返回值為int型 注意 宣告函式指標時必須在 號與指標名稱pf之外加上 否則不能成功 例程 函式指標 includ...
關於this指標的傳遞問題總結
1 cdecl成員函式 通過ecx傳遞this指標 mov ecx,物件的位址 call 成員函式 2 stdcall成員函式 通過堆疊傳遞this指標 push 物件的位址 call 成員函式 用非靜態成員作為執行緒函式 原理分析 1.該執行緒的主函式為類的非靜態成員函式,所以它認為他的呼叫者會為...