1. 什麼是指標?
指標是乙個變數,其值為另乙個變數的位址,即,記憶體位置的直接位址。
在使用指標儲存其他變數位址之前,對其進行宣告。指標變數宣告的一般形式為:type *var-name;
type 是指標的基型別,它必須是乙個有效的 c++ 資料型別,var-name 是指標變數的名稱。星號是用來指定乙個變數是指標。以下是有效的指標宣告:
int
*ip;
/* 乙個整型的指標 */
double
*dp;
/* 乙個 double 型的指標 */
float
*fp;
/* 乙個浮點型的指標 */
char
*ch;
/* 乙個字元型的指標 */
不同資料型別的指標之間唯一的不同是,指標所指向的變數或常量的資料型別不同。
2. 如何使用指標
定義乙個指標變數、把變數位址賦值給指標、訪問指標變數中可用位址的值。
#include
using namespace std;
int main (
)
column 1
column 2
null 指標
c++ 支援空指標。null 指標是乙個定義在標準庫中的值為零的常量。
指標的算術運算
可以對指標進行四種算術運算:++、–、+、-
指標 vs 陣列
指標和陣列之間有著密切的關係
指標陣列
可以定義用來儲存指標的陣列
指向指標的指標
允許指向指標的指標
傳遞指標給函式
通過引用或位址傳遞引數,使傳遞的引數在呼叫函式中被改變
從函式返回指標
允許函式返回指標到區域性變數、靜態變數和動態記憶體分配
#include
using namespace std;
int main (
)
在大多數的作業系統上,程式不允許訪問位址為 0 的記憶體,因為該記憶體是作業系統保留的。
然而,記憶體位址 0 有特別重要的意義,它表明該指標不指向乙個可訪問的記憶體位置。
但按照慣例,如果指標包含空值(零值),則假定它不指向任何東西。
因此,可以防止誤用乙個未初始化的指標。
#include
using namespace std;
const
int max =3;
int main ();
int*ptr;
// 指標中的陣列位址
ptr = var;
for(
int i =
0; i < max; i++
)return0;
}
#include
using namespace std;
const
int max =3;
int main ();
int*ptr;
// 指標中第乙個元素的位址
ptr = var;
int i =0;
while
( ptr <=
&var[max -1]
)return0;
}
上述兩個**被編譯和執行時,會產生同樣的結果:
address of var[0] = 0xbfce42d0
value of var[0] = 10
address of var[1] = 0xbfce42d4
value of var[1] = 100
address of var[2] = 0xbfce42d8
value of var[2] = 200
#include
using namespace std;
const
int max =3;
int main ();
for(
int i =
0; i < max; i++
)return0;
}
把指標運算子 * 應用到 var 上是完全可以的,但修改 var 的值是非法的。
這是因為 var 是乙個指向陣列開頭的常量,不能作為左值。
由於乙個陣列名對應乙個指標常量,只要不改變陣列的值,仍然可以用指標形式的表示式。
例如,把 var[2] 賦值為 500:*(var + 2) = 500;
上面的語句是有效的,且能成功編譯,因為 var 未改變。
#include
using namespace std;
const
int max =3;
int main ();
int*ptr[max]
;for
(int i =
0; i < max; i++
)for
(int i =
0; i < max; i++
)return0;
}
當上面的**被編譯和執行時,它會產生下列結果:
value of var[0] = 10
value of var[1] = 100
value of var[2] = 200
#include
using namespace std;
int main (
)
通過檢視 var,ptr,*pptr 的位址可以更加清晰的理解多級間接定址的定址過程。
var的位址=ptr的值=*pptr的值
#include
#include
struct stu
;void
f(_____,
int num),}
; num = s[1]
.num;
strcpy
(name, s[1]
.name);}
main()
,},*p;
p=s;
f(p->name, p->num)
;printf
("%s %d\n"
, p->name, p->num)
;}
為了輸出pp 10003
,橫線部分可以寫成
char *name
char name
char* &name
int * myfunction()
c++ 不支援在函式外返回區域性變數的位址,除非定義區域性變數為 static 變數。
#include
#include
#include
using namespace std;
// 要生成和返回隨機數的函式
int*
getrandom()
return r;
}// 要呼叫上面定義函式的主函式
int main (
)return0;
}
當上面的**被編譯和執行時,它會產生下列結果:
624723190
1468735695
807113585
976495677
613357504
1377296355
1530315259
1778906708
1820354158
667126415
*(p + 0) : 624723190
*(p + 1) : 1468735695
*(p + 2) : 807113585
*(p + 3) : 976495677
*(p + 4) : 613357504
*(p + 5) : 1377296355
*(p + 6) : 1530315259
*(p + 7) : 1778906708
*(p + 8) : 1820354158
*(p + 9) : 667126415
C 學習筆記 四 指標 4
類成員指標 本文主要討論 c 中類成員的指標,這部分內容少有使用,也比較難於理解。如果文中有錯誤或遺漏之處,敬請指出,謝謝!需要使用類成員指標的情況是比較少見的,所以一般沒人使用這個語言特性。下面先介紹類成員指標的使用方法,再介紹它的可能應用場合。有時,我們需要在類外的其它地方直接獲得類成員,這時我...
C語言學習4 指標
int a 10 int p a 一級指標 int s p 二級指標 int p 10 指向陣列的指標 int s 10 指標指向放指標的陣列 這個陣列有十個空間 int p 10 開闢10個空間 每個空間放指標 例如 int br 10 int s 10 br int ar 10 int p 10...
《c和指標》摘錄4 指標
記憶體和位址 計算機的記憶體由數以億計的位 bit 組成,每個位可以容納0或1。由於乙個位能表示的值範圍太有限,所以單獨的用處不大,通常許多位合成一組作為乙個單位,這樣就可以儲存範圍比較大的值。指標變數 專門存放變數的位址的變數 定義指標變數 資料型別 變數名 int a 指標變數必須初始化再使用 ...