引用和指標看上去差不多,(看上去差不多,其實男寶寶和女寶寶是不一樣的)用起來還是有一定差距。本人菜鳥僅將遇到的問題記錄備案,以便日後翻查
ptrfunc.h
#ifndef ptrfunc_h__
#define ptrfunc_h__
typedef int (*func)(int,int);
struct aa
;#endif
1、錯誤
main.cpp
#include
#include "ptrfunc.h"
extern void getinfo (aa pp);
int main(int argc,char* argv)
inte***ce.cpp
#include "ptrfunc.h"
#include
int add(int a,int b)
void getinfo(aa p)
[root@localhost test]# g++ inte***ce.cpp main.cpp -g -o main
[root@localhost test]# ./main
pm's a is 3
段錯誤 (core dumped)
2、錯誤
main.cpp
#include
#include "ptrfunc.h"
extern void getinfo (aa *pp);
int main(int argc,char* argv)
inte***ce.cpp
#include "ptrfunc.h"
#include
int add(int a,int b)
void getinfo(aa *p)
[root@localhost test]# g++ inte***ce.cpp main.cpp -g -o main
[root@localhost test]# ./main
段錯誤 (core dumped)
3、正確
main.cpp
#include
#include "ptrfunc.h"
extern void getinfo (aa *pp);
int main(int argc,char* argv)
inte***ce.cpp
#include "ptrfunc.h"
#include
int add(int a,int b)
void getinfo(aa *p)
[root@localhost test]# g++ inte***ce.cpp main.cpp -g -o main
[root@localhost test]# ./main
pm's a is 3
result is 5
4、正確
main.cpp
#include
#include "ptrfunc.h"
extern void getinfo (aa &pp);
int main(int argc,char* argv)
inte***ce.cpp
#include "ptrfunc.h"
#include
int add(int a,int b)
void getinfo(aa &p)
[root@localhost test]# g++ inte***ce.cpp main.cpp -g -o main
[root@localhost test]# ./main
pm's a is 3
result is 5
後記:
int n;
int &m = n;
在c++中,多了乙個c語言沒有的引用宣告符&,如上,m就是n的引用,簡單的說m就是n的別名,兩者在記憶體中佔同樣的位置,不對m開闢新的記憶體空間,對m的任何操作,對n來說是一樣的。
對於引用,有以下三條規則:
(1)引用被建立的同時必須被初始化(指標則可以在任何時候被初始化)。
(2)不能有null 引用,引用必須與合法的儲存單元關聯(指標則可以是null)。
(3)一旦引用被初始化,就不能改變引用的關係(指標則可以隨時改變所指的物件)。
假如在乙個函式中動態申請記憶體空間,用指標和用引用作形參會得到不同的結果,如下面的例子:
void fun(int* b)
}void fun(int* &b)
}如果在main函式中定義了乙個int型的空指標並分別作為實參傳入,如下:
int main()
cout << "\n";
return 0;
}結果用指標的函式會出現記憶體訪問出錯,用引用的函式則執行正常並正確輸出1 2 3.
這是因為:
1.指標雖然是位址傳遞,但實際上也是在函式中又定義了乙個新的指標讓其與傳入的指標指向同一位址。但兩個指標本身作為變數在記憶體中的存放位址是不同的,就是說這是兩個不同的變數,只是內容(即所指位址)相同。
2.在函式中對新定義的指標動態申請記憶體,但是當函式結束後,申請的記憶體的生命週期也就結束了,所以當回到主函式時,作為實參的指標位址和內容都沒有變化。仍然是個空指標,對其進行訪問自然出現了記憶體讀錯誤了。
假如在main函式中這樣寫:
int *a = (int*)malloc(sizeof(int)*3);
就不會出現記憶體讀錯誤了,但是輸出結果還是錯誤的,道理也是一樣的。
3.用引用作為實參傳入時,fun函式中的b其實就是主函式中a的別名(或者叫外號),反正就是操作完全相同,位址相同,內容相同的乙個變數,所以當fun函式返回時,對b的操作在主函式中對a同樣有效。
再看乙個例子:
int *a = null;
char* b = (char*)a;
int *a = null;
char* &b = (char*)a;
這一次是在編譯階段的區別:
用指標可以通過編譯,而用引用則不可以,提示型別轉換出錯。
通過這兩個例子可以看出,指標比引用靈活,也更加危險。
摘自『高質量c++程式設計』
條款一:指標與引用的區別
指標與引用看上去完全不同(指標用操作符』*』和』->』,引用使用操作符』.』),但是它們似乎有相同的功能。指標與引用都是讓你間接引用其他物件。你如何決定在什麼時候使用指標,在什麼時候使用引用呢?
首先,要認識到在任何情況下都不能用指向空值的引用。乙個引用必須總是指向某些物件。因此如果你使用乙個變數並讓它指向乙個物件,但是該變數在某些時候也可能不指向任何物件,這時你應該把變數宣告為指標,因為這樣你可以賦空值給該變數。相反,如果變數肯定指向乙個物件,例如你的設計不允許變數為空,這時你就可以把變數宣告為引用。
ps:引用在定義時不可加const,否則編譯出錯,在形參前面則可以加const以確保在函式中該變數不會被修改。
C 指標和引用
在深入介紹之前我們首先來看一下指標和引用的定義 指標和引用的區別,然後分別針對指標和引用展開討論,深入細節為何有這些差異。指標和引用的定義,下面用通俗易懂的話來概述一下 而宣告指標是可以不指向任何物件,也正是因為這個原因,使用指標之前必須做判空操作,而引用就不必。其次,引用不可以改變指向,對乙個物件...
C 指標和引用
有了變數名,為什麼還需要乙個別名呢?c 之所以增加引用型別,主要是把它作為函式引數,以擴充函式傳遞資料的功能 到目前為止我們介紹過函式引數傳遞的兩種情況 1 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的 如果在執行函式期間形參的值發生變化,並不傳回給實參 因為在呼叫函式時,形參和實...
c 指標和引用
有了變數名,為什麼還需要乙個別名呢?c 之所以增加引用型別,主要是把它作為函式引數,以擴充函式傳遞資料的功能。到目前為止我們介紹過函式引數傳遞的兩種情況。1 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的。如果在執行函式期間形參的值發生變化,並不傳回給實參。因為在呼叫函式時,形參和實...