指標是c語言的靈魂。通過指標,可以輕鬆地訪問記憶體中的資料,對資料進行讀寫
概念:指標是變數,用來存放記憶體位址,位址一般用16進製制的數字表示,用來唯一標識一塊記憶體,我們可以通過&
獲取變數的位址
指標變數的定義語法:資料型別* 變數名;
指標變數與普通變數的區別:普通變數存放資料,指標變數存放位址;指標變數可以通過*
操作符操作指標變數指向的那塊空間,這個過程稱為解引用
指標的大小:指標在32位平台是4個位元組,在64位平台是8個位元組(與指標的型別無關)
指標的型別:指標的型別決定了指標進行int i =10;
char c =
'y';
int* pi =
&i;char
* pc =
&c;printf
("%d\n"
,sizeof
(pi));
//32位平台輸出4,64位平台輸出8
printf
("%d\n"
,sizeof
(pc));
//32位平台輸出4,64位平台輸出8
+/-
操作的結果,也決定了對指標解引用時可以操作幾個位元組
執行以上**,結果如下:int i =10;
char c =
'a';
int* pi =
&i;char
* pc =
&c;printf
("%p\n"
, pi)
;printf
("%p\n"
, pi +1)
;printf
("\n");
printf
("%p\n"
, pc)
;printf
("%p\n"
, pc +1)
;
可以看到,int*
型別的指標+1,位址數值+4;char*
型別的指標+1,位址數值+1。同時,對int*
型別的指標進行解引用操作可以訪問4個位元組的資料,對char*
型別的指標進行解引用操作只能訪問1個位元組的記憶體
空指標:空指標是指向記憶體編號為0的空間的指標,空指標指向的記憶體不可以訪問,主要作用是初始化變數
野指標:指向非法記憶體空間的指標// 定義乙個double型別的指標變數,指向記憶體位址為0的空間
double
* pd =
null
;// 對空指標進行解引用操作進行訪問,賦給double型別的變數
// 此條語句執行出錯,記憶體編號0 ~255為系統占用記憶體,不允許使用者訪問
double d =
*pd;
const與指標:
指標和函式:利用指標作函式的引數,可以修改實參的值;若不想修改實參,也可以用值傳遞的方式// 定義兩個變數m和n,並為它們賦初始值
int m =10;
int n =20;
// const修飾指標,指標的指向可以修改,但指向的值不能修改
const
int* pm =
&m;pm =
&n;// 正確,指向可以修改
//*pm = 30; // 報錯,指向空間裡的值(*pm)不可修改
// const修飾常量:指標的指向不能修改,但指向的值可以修改
int*
const pn =
&n;//pn = &m; // 報錯,指向(pn)不可修改
*pn =40;
// 正確,指向空間裡的值(*pn)可以修改
引用是 給變數取的別名 ,不是新定義乙個變數,引用型別必須和引用實體型別相同;引用和它引用的變數共用同一塊空間;語法:#include
void
swap1
(int a,
int b)
void
swap2
(int
* pa,
int* pb)
intmain()
型別& 引用名 = 引用實體;
引用的特性:int a =10;
// 定義乙個int型別的變數a
int& ra = a;
// 使用引用給a起乙個別名ra
printf
("a=%d \nra=%d\n\n"
, a, ra)
;// a與ra的值相同
printf(,
&a,&ra)
;// a與ra的位址相同
int a =10;
int b =20;
//int& ra; // 報錯,需要初始化
int& ra1 = a;
int& ra2 = a;
ra1 = b;
// 這是賦值操作,並不是把ra1修改為了b的引用
引用做函式返回值:引用可做函式引數的返回值,但引用做函式引數返回值時,所返回的變數的生命週期必須比函式更長,不能返回區域性變數// 使用引用傳參的函式可以完成對值的交換
void
my_swap
(int
& a,
int& b)
intmain()
引用雖然是給變數取的別名,和所引用的變數共用同一快空間,但引用在c++內部實現是乙個指標常量(指向不可改變,指向的值可以改變)// 引用做函式返回值
int&
test_ref1
(int
& a)
// 函式返回區域性變數的引用
int&
test_ref2
(int a,
int b)
intmain()
指標和引用的不同點:
指標引用
指標宣告時不是必須要初始化
引用在宣告時就要初始化
指標有null指標
沒有null引用
指標可以隨時修改指向,使其指向另乙個同型別的實體
引用一旦引用某個實體,就不能進行修改
指標++的結果是向後偏移乙個資料型別的大小
引用++是將引用實體+1
修改指標指向的值時,需要進行解引用操作
修改引用實體時,不需要解引用,可以直接修改引用達到修改引用實體的效果
指標的大小與型別無關,只與平台有關
引用的大小是實體的大小
指標有多級指標
沒有多級引用
操作指標可能會引發危險
引用的使用相對安全
C C 指標和引用區別
引用是別名,所以自身沒有空間,那麼必須與乙個合法的儲存單元關聯,所以定義必須初始化,所以引用不能為空,沒有null引用。指標是型別,有空間,可以為null,適用於動態分配記憶體。本質區別就是引用是別名,指標是型別,所以才表現出各自不同的特點。參考 1 儲存空間 指標是實體,有記憶體空間 引用是別名,...
C C 中的引用和指標
引用又稱 別名,它可以最為物件的乙個名字,但它既不是物件的指標,也不是物件的副本。通過引用可以間接地操作物件,使用方式類似於指標,但不需要指標的語法。使用規則 1 引用被建立的同時必須被初始化,指標可以在任何時候被初始化 int a 12 int b a 正確 int c 錯誤 2 一旦引用被初始化...
C C 中的引用和指標
引用又稱 別名,它可以視為物件的乙個名字,但它既不是物件的指標,也不是物件的副本。通過引用可以間接地操作物件,使用方式類似於指標,但不需要指標的語法。使用規則 1 引用被建立的同時必須被初始化,指標可以在任何時候被初始化 int a 12 int b a 正確 int c 錯誤 2 一旦引用被初始化...