指標和引用
區別
>引用在建立的時候需要初始化, 指向有效物件, 必須與合法的儲存單元關聯, 不能再改變為其他物件的引用;
>指標可以在定義以後任意時候再初始化, 指向的位址和位址內存放的資料都可以改變;
>引用不可為空, 指標可以為空 (0/null);
>const指標可以是null, 也有可能是野指標;
>引用和指標的語義是相似的, 引用是不可改變的指標, 指標是可以改變的引用. 其實都是實現了引用語義.
常引用
>利用引用提高效率 保護資料不被改變 const [type]& [name] = var;
note
void* p; 不能++;
---end---
函式傳參
傳值
>函式內會為形參開闢乙個新的記憶體空間存放實參的值, 是實參的副本;
>指標是個存放位址的變數,傳遞
指標引數本質上是值傳遞, 傳遞的是記憶體位址, 固定大小(乙個pointer, 一般為4);
>如果函式的形參為字串指標, 那傳遞的是位址值, 在函式內部修改形參的值並不能真正的改變傳入實參的值;
void getmemory( char* p )>p陣列為函式內的區域性自動變數, 棧內存在函式返回後記憶體已經被釋放;
char* getmemory( void)傳指標
>如果是修改指標指向的位址存放的值, 這樣可以改變實參的值;
void getn(int* n)>要改變指標指向的位址, 使用指標的指標, 或者指標的引用;
void getmemory( char** p, int num )傳引用
void getmemory( char* &p, int num )>引用傳遞中, 函式的形參雖然也作為區域性變數在棧中開闢了記憶體空間, 但是存放的是函式傳遞進來的實參的位址; 對形參的操作會被處理成間接定址(通過棧中存放的位址訪問實參的資料變數).
>引用不產生物件副本(不會呼叫構造), 引數傳遞時不需要複製物件, 提高效率;
>如果函式返回了引用, 那麼函式的呼叫也可以被賦值;
double &max(double &d1,double &d2)//---
max(x,y)+=1.0;
---end---
指標陣列和陣列指標
指標陣列-儲存指標的陣列; int* p[n]: 宣告了乙個陣列, 陣列的元素是n個int型的指標;
的優先順序比*高, p和先結合成為陣列; p是指向陣列首位址的指標; [原文說p是個不可知的表示]
[原文說:執行p+1是錯誤的, 但(p+1)就是指向p[1]的指標, 就是指向陣列元素(int指標)的指標)]
>指標陣列是多個指標變數, 以陣列的形式存放在記憶體中, 占有n個指標的儲存空間;
>二維陣列賦給指標陣列:
int *p[3];//陣列存放了3個指標變數 p[0]~p[2]表示陣列中i行j列的元素的方式: *(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]int a[3][4];
for(i=0;i<3;i++)
陣列指標-指向陣列的指標; int (*p)[n]: 宣告了乙個指標, 指向乙個擁有n個int元素的陣列;
()的優先順序高, p和*結合成為指標; 這個一維陣列的指標也稱為行指標, p+1時, p會跨過n整個整型資料的長度(步長), 也就是跨過陣列;
>陣列指標是乙個指標變數, c語言中用來指向二維陣列, 記憶體中只佔乙個指標的儲存空間;
class **menu = new menu*[num]; //指標指向陣列, 陣列的內容是指標, 即: 指標陣列的陣列指標...>二維陣列賦給陣列指標:
int a[3][4];int (*p)[4]; //該語句是定義乙個陣列指標,指向含4個元素的一維陣列。
p=a; //將該二維陣列的首位址賦給p,也就是a[0]或&a[0][0]
p++; //該語句執行過後,也就是p=p+1;p跨過行a[0]指向了行a[1]
指標和陣列
char str = "world"; cout <>str是陣列名, 編譯器通過陣列名查到陣列大小, str是c風格的字串, 長度需要加上乙個\0;>對於模板形式有點不同:>p是指標, 長度為乙個位址, 大小不變, 一般情況下, 32位是4, 64位是8;
>不變的還有char, 佔乙個機器位元組;
---end---
常量指標和指標常量
>常量指標- 指向常量的指標; 指標指向的內容不可修改, 指標自身的位址值可變;
const在*左邊: const char* ptr; 或 char const* ptr; 讀作:pointer to constchar: 指向const char的指標; (內容不變)
>指標常量- 指標是乙個常量; 指標內儲存的位址值不可變, 指向的資料內容可修改;
const在*右邊: char* const ptr; 讀作:const pointerto char: const指標, 指向char; (位址不變)
[中文翻譯坑爹, 用英文理解就很清晰, 中文應該記成: 常量的指標, 指標是常量]
int a = 1;
int b = 2;
int* pa = &a;
int* const* pointertoconstpointer = &pa;
int* pb = &b;
pointertoconstpointer = &pb;
*pointertoconstpointer = pb; //error
**pointertoconstpointer = 10;
//1std::vector::const_iterator iter = vec.begin(); //內容是const的
*iter = 10;//錯誤,iter是常量指標
iter++;//正確,iter本身可變
//2const std::vector::iterator iter = vec.begin(); //位址是const的
*iter = 10; //正確,指標常量
iter++; //錯誤,指標本身不可變
& ---end---
other
過載運算子不能對指標單獨操作
>因為系統已經定義了兩個指標的運算, 你不能改變它; e.g. 兩個同型別的指標相加, 就是位址相加, 如果編譯器未定義就是無意義的;
note指標之間可以相減, 但不可以相加: 兩個同一型別的指標變數是可以相減的, 他們的意義表示兩個指標指向的記憶體位置之間相隔多少個元素(注意是元素, 並不是位元組數) 例如對於int型別的指標p和p1. p1-p的意義表示他們之間相隔多少個int型別的元素. 同樣對於其他型別的指標變數之間相減的意義也是一樣.
>運算子過載引數必須至少有乙個類型別的形參;
friend test operator * (const test &src1, const test *src2) //ok---end---friend test operator * (const test *src1, const test *src2)//error
c 中指標和引用注意點整理
int a 3 4 int p 4 a p a 2 這裡為什麼需要取位址符?c 中a 2 不就是下級陣列名嗎?為什麼還要取位址?根據這個問題,我發現了自己對指標和引用還有陣列實質的理解還是有點模糊,比如問題中提到的 a 2 不就是下級陣列名嗎?我沒法確切給出答案,因為我也不確定。這個問題下面討論會再...
指標和引用,const 指標和const 引用
指標和引用是在使用中經常弄混淆的兩個概念。引用 reference 為物件起了另外乙個名字,用符號 表示。name,例如 int i 1024 int ref i 一般在初始化變數時,初始值會被拷貝到新建立的物件中,然而定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引...
指標和引用
一 先看一段 include using namespace std void freeptr1 int p1 void freeptr2 int p2 void main 思考 在 freeptr1 和freeptr2 的比較中,你能發現它們的不同點嗎?二 對 進行解釋 include using...