指標和引用 整理

2022-07-29 21:51:31 字數 4087 閱讀 8081

指標和引用

區別

>引用在建立的時候需要初始化, 指向有效物件, 必須與合法的儲存單元關聯, 不能再改變為其他物件的引用;

>指標可以在定義以後任意時候再初始化, 指向的位址和位址內存放的資料都可以改變;

>引用不可為空, 指標可以為空 (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]

int a[3][4];

for(i=0;i<3;i++)

表示陣列中i行j列的元素的方式: *(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]

陣列指標-指向陣列的指標; 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;

>對於模板形式有點不同:

//1

std::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

friend test operator * (const test *src1, const test *src2)//error

---end---

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...