1、
指標是什麼?
要想明白指標的含義,首先應該明白變數在記憶體中是如何儲存的,如何讀取的。記憶體中每個記憶體單元都有乙個位址,這好比旅館中每個房間,都有唯一的房間號。至於記憶體單元中到底存放的是什麼內容,那是我們定義的變數。當我們定義乙個變數時,系統會根據我們宣告的資料型別而為變數分配適當的儲存空間。如c
語言中的
int型別的變數,系統會為他分配
2個位元組的記憶體單元。而當程式經過編譯以後,原來的變數已經轉換為變數的位址,對變數值的訪問都是通過位址進行的。在c
2、指標變數
指標變數與指標是兩個不同的概念。指標是變數的位址,而指標變數是儲存位址的變數,換句話說,指標變數就是儲存指標的變數。
定義指標變數的格式是:基型別 *
指標變數名;如:
float *pointer1
;其中,基型別是該指標所指向的目標變數的資料型別。
可以將某個已初始化的,基型別相同的指標變數賦值給指標變數。如:int i
; int *p=&i;
int *q=p;
其中,&和*
是兩種運算子,
&是取位址運算子,
*是指標運算子。如&a是
a的位址,
*p是指標
p所指向儲存單元的內容。
3、指標變數作為函式引數(***)
首先應該明白:指標變數作為函式引數和非指標變數作為函式引數有著質的區別。因為c
語言中函式引數是「單向值傳遞」。呼叫函式將實參的值傳給形參,然後就不會再管形參的命運了。打個比方,我把我的檔案複製了乙份給了另乙個人,至於他對那份複製品所做的任何修改也不會對我的原始檔產生絲毫影響。但用指標變數作為形參就不同了,雖然他仍然是「值傳遞」,但傳遞的變數的位址。同樣打個比方,旅館原來的兩個房間號分別是
303和
304,
303中住的是王先生,
304中住的是張先生。現在,我說:「
303的住戶是王先生,
304的住戶是張先生」。但現在,我只將
303和
304的房間號對換,則我現在應該說:「
303的住戶是張先生,
304的住戶是王先生」了。下面再看兩個交換函式,看看為什麼乙個可以成功交換,而另乙個卻不可以。
void swap(int x, int y)
在main
函式中,呼叫
swap
函式,swap(a
, b);結果,
main
函式輸出的結果根本還是未交換的a,
b。
void swap(int *pointerx, int *pointery)
在main
函式中,呼叫
swap
函式,swap(a
, b);結果,
main
函式輸出的結果是交換後的的a,
b。
4、指標與陣列
陣列元素的指標就是陣列元素的位址。c
語言規定,陣列名代表陣列中首元素的位址。
因此,乙個指向陣列的指標,就是指向這個陣列的首元素的位址。所以,int a[10]; int *p;
p=a與
p=&a[0]
是等同的。
在c語言中,如果,指標
p已經指向陣列的第乙個元素,則
p+1指向陣列的下乙個元素,而不是將
p的值簡單的加
1。如:如果陣列為
int型別,則原來p指向
2000
位址,則
p+1指向
2002,而*
(p+1
)則為該陣列元素的值。
*(p+i)
與p[i]
是等價的。
若陣列是2
維的,如:
a[10][10],則a
,a[0], &a[0] &a[0][0]
都可以表示該二維陣列的首位址。a,
a+i,
a[i],*
(a+i),*
(a+i)+j
, a[i]+j
都是位址。
5、字串與指標
可以將乙個字串賦值給乙個字元型指標變數。如:char *strpointer=
「i love china
」;但注意,這裡不是將「
i love china
」幾個字元賦值給
strpointer
指標變數,而是將該字串的首位址賦值給了
strpointer
。輸出時用
printf
(「%s
」 strpointer
);即可
6、指向函式的指標
乙個函式在編譯時被分配給乙個入口位址,這個入口位址就是該函式的指標。所以可以用乙個指標變數指向該函式。函式名稱就代表該函式的入口位址。定義的格式如下:
資料型別 (*
指標變數名)(函式引數列表)。如:
int (*p
)(int x
, int y
);另外,函式的返回值也可以是指標型別。
7、指標陣列和指向指標的指標
乙個陣列,如果他的所有元素的型別都是指標,則我們就稱這個陣列為指標陣列。定義指標陣列的格式如下:型別名 *
陣列名[
陣列長度
];如:
int *p[4];
就是乙個包含四個指標的陣列。
指標的指標,顧名思義就是指標所指向的型別依然是乙個指標型別。定義格式如下:型別名 **
變數名。如:
int **p;
乙個指標陣列的陣列名就是乙個雙重指標,可以進行自增自減運算。
乙個二維陣列的陣列名同樣可以理解為乙個雙重指標,可以定義乙個雙重指標指向某個二維陣列。
this指標學習筆記
1.this指標的用處 乙個物件的this指標並不是物件本身的一部分,不會影響sizeof 物件 的結果。this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的位址作為乙個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候也是加...
指標學習筆記
記憶體位址所指向的是當前儲存資料的首位址,資料型別所指向的是當前儲存資料的長度 占用多大的記憶體空間 指標是一種資料型別,也需要占用記憶體空間,它的屬性是指向乙個資料型別的首位址和長度。指標儲存的是位址,長度取決於指標的型別。在32位系統下,指標占用的空間為32bit 4byte 在64位系統下,指...
指標學習筆記
指標基本宣告與使用 int num 1 int pnum int nums 5 int pnums nums int p newint 10 p 10 cout pnum pnum endl pnums pnums endl p p endl delete p 將指標置為空 pnum 0 int z...