C 高手指點(關於指標和引用)

2021-09-11 19:03:49 字數 4085 閱讀 8122

1樓:湯靈杉

你問的這個話題太大。關於指標和引用要講的東西很多。

我的理解:

指標: 其實指標這個概念在譚浩強的

變數,所以一定不要將指標與指標變數搞混淆了。指標僅僅是一個地址值,而指標變數就是存放指標(也就是地址的變數)

指標的定義:

例如整型指標: int *p;p是一個指向int型別資料的指標變數。裡面存放的地址(也就是指標)是一個int型別變數的地址。指標變數時

有型別的,例如p的型別就是int *表示p是一個指向int型別的指標變數。如何知道一個指標變數的型別呢,最簡單的方法就是去掉變

量定義語句中的變數名,剩下的部分就是其型別,這種方法適用於所有的變數定義,例如int a;a的型別是int 。 int b[10];b的類

型是int表示是一個陣列(關於陣列型別這裡不談,因為這個問題很微妙,其實在c、c++中沒有陣列型別這個概念,包括函式型別也

是一樣的),int *c;c的型別是int *。int ** d;d的型別就是int **;所以通過這種方法來判斷一個變數的型別是很方便的。

說道指標變數,我們必須說到得有幾個方面。

1.指標型別。

這個很重要,一個指標是有型別的,也就是一個地址是有型別的。具體說是某一個地址會指向不同型別的資料,這是不一樣的,例如

int *p;p是指向int型資料。 double*p1;p1是指向double型資料。但是p和p1本身在記憶體中佔用的空間是4個位元組(對於32位的系統來說

),如果是在tc中編譯c程式,應該是2個位元組了(dos作業系統是16位的)。有人說地址不就是一個值嗎,類似於0xfffdddcc這樣的地址

數值,為什麼還分什麼型別呢,我要說的是這個關係很大。我們知道指標是有運算的,int *p=&a;那麼p++到底加了多少呢,不要以為

是將p裡面的地址值加了1,這是完全想當然。實際上加了sizeof(int)這麼多個位元組。也就是說加了一個int元素應該佔用的位元組,這

樣在陣列中我們可以通過這種方式從上一個元素很方便的讓指標變數指向下一個元素。p+5的話實際上是加了p+sizeof(int)*5這麼多

個位元組。 另外一點事指標的型別決定了當指標解引用的時候其所以指向的記憶體單元中的二進位制資料如何解釋的問題。例如int *p=&a;

那麼(*p)取得的數字就是一個整型資料,如果(*((char *)p))得到的就是一個字元型資料了。p本來指向的是int型資料(有4個位元組)的

首地址,如果將其強制轉換為一個指向char型別的指標變數,那麼在解引用的時候只取第一個位元組的資料,並將其解釋為一個ascii碼

代表的字元。 還有如果是一個指向函式的指標變數,我們可以通過此指標變數直接呼叫函式。例如int(*function)(int);此時

function指向一個函式,此函式具有一個int引數,返回一個int值。那麼通過指標可以這樣呼叫該型別的函式了int a=function

(100); 或者int a=(*function)(100);其實要不要解引用都是可以的。不過以前是需要解引用的,現在c標準規定這兩種方法都可以。

總的來說指標的型別很重要。

2.指標與陣列。

我們向一個函式傳遞陣列的時候一般是傳遞陣列名,我們知道陣列名是一個代表陣列中第一個元素的地址並且陣列名是不可以當左值

的。其實你又沒有想過陣列名到底是什麼呢。有人說其實陣列名就是一個指標常量,是一個不可以改變的指標常量。例如:int a[10]

=; 那麼a可能的型別是int * const a;注意const的位置(關於指標常量和常量指標,這個以後說),那麼這種

說法到底對不對呢。我們可以通過sizeof運算子來計算某一種資料型別佔用的儲存空間。例如 sizeof(10)的值為4,注意這裡我都假

設在32位的作業系統上面編譯。其實sizeof(10)和sizeof(int)是一樣的,僅僅是求這種型別的資料佔用多少記憶體空間,而不是說具體

的某個資料佔用的空間,因為對於10這個文字常量來說根本不會佔用記憶體空間的,其實隨著程式直接編碼到源程式中的,不存在分配

記憶體的問題。那麼我們這樣計算sizeof(a);是不是如我們所願得到的是4呢。 結果可能會有意外,因為其值是sizeof(int)*10也就是

40個位元組,顯然這個位元組數是整個陣列佔用的位元組數。而不是int *型別的指標變數佔用的位元組數,我們知道一個地址只佔用4個位元組

那麼這說明陣列名絕對不是簡單的int*型別。但是陣列確實具有int*的特性。例如int*p=a;這是不會報錯的。而且在函式之間傳遞的

時候也是採用這樣的方式:

void print(int b[10]){}

呼叫函式:

print(a);

或者:print(&a[0]);

都是一樣的。

注意在某一個函式內對形參進行sizeof:

void print(int c[100])

3. 指標與函式

一個指標可以指向一個函式,指標可以作為函式引數,函式可以返回一個指標型別的資料。

指向函式的指標: 指向函式的指標,實際上此指標就是函式**的入口地址。我們可以通過這樣的方式呼叫函式。例如:

void print1(int x)

void print2(int y)

那麼在main函式中可以這樣寫:

void (*p)(int)=print1;//函式名代表函式入口地址值,和陣列一樣,print1不僅僅是一個地址。

p(10);

p=print2;

p(20);

這都是可以的,另外我們可以通過一個指標陣列存放指向函式的指標:

void (*aa[2])(int)=;

for(int i=0;i<2;i++)

關於各種指向函式指標的宣告,請自己查閱有關資料。

引用:引用相當於別名,其實你直接將其當做一個別名就可以了。引用與指標的區別: 引用必須初始化,而且初始化之後不可更改,指標

卻可以。

2樓:

指標式一種資料型別,就像整型,浮點型

指標中儲存的不是資料本身而是資料在記憶體中的地址,但是我們仍然可以通過指標對資料進行操作,比如類裡面this之針,就好比快捷方式吧

雖然指標和引用都是用&符號,但是意義是不同的

至於引用,就像給函式起了一個錯號,比如int a=2;int &b=a就是給a去了個錯號b而

a++和b++效果是一樣的以此類推

對b的操作就是對a的操作

好像引用和指標沒什麼不同,其實指標比引用作用大,記住指標是指向記憶體這個計算機最核心的地方的,一些特殊操作比如實現類的繼承、多型等等就能體現其重要性,當然其他作用也很大。另外如果還是搞不懂,就從格式上區分吧

指標可以直接申明比如可以直接寫int *a,但不能寫int &a做引用,因為指標也是一種資料型別

不知道看懂沒

3樓:

指標是存放地址

引用相當於給變數起了個小名

4樓:

《c++物件導向程式設計》或者《c++簡明教程》。

其實,只要認真仔細地學好一本書很好了。

5樓:

你最好是具體問題具體分析,這樣問才有進步

6樓:匿名使用者

必然是譚浩強,基礎內容用他的

c++中指標和引用的區別詳解

7樓:匿名使用者

1. 指標是一個實體,而引用僅是個別名;

2. 引用使用時無需解引用(*),指標需要解引用;

3. 引用只能在定義時被初始化一次,之後不可變;指標可變;

引用「從一而終」 ^_^

4. 引用沒有 const,指標有 const,const 的指標不可變;

5. 引用不能為空,指標可以為空;

6. 「sizeof 引用」得到的是所指向的變數(物件)的大小,而「sizeof 指標」得到的是指標本身(所指向的變數或物件的地址)的大小;

typeid(t) == typeid(t&) 恆為真,sizeof(t) == sizeof(t&) 恆為真,但是當引用作為類成員名稱時,其佔用空間與指標相同4個位元組(沒找到標準的規定)。

7. 指標和引用的自增(++)運算意義不一樣;

求C語言高手指點,求C語言高手指點

a就是a 0 可以看作是個陣列名,它的元素是int,而不是int,a i 就是 a 0 i 所以i的最大範圍是整個陣列的長度,而不是列數 你定義p指標是一維陣列,所以p的內容應該是1,2,3 但是你輸出陣列內容時做了個6次的迴圈,指標超出了一維陣列最後一個定義的內容後,只能順序向後移動輸出,而a陣列...

c 中的問題指標和指標加引用

值都會改變,指標傳遞 傳遞的是指標,指標地址傳遞 傳遞的是指標的地址。首先明確 指標這個變數 裡面記錄的內容 是一個地址 所以你通過指標,間接的去修改指標指向的地址內的資料和直接修改指標地址內記錄對應的資料 從結果上講是一樣的 a 將指標的地址傳入。這樣你可以更改指標儲存的東西 更改地址讓原來的指標...

c程式錯誤,請高手指點,c 程式6個錯誤,請高手指點

if條件要加括號,而且在條件和執行語句之間不要加分號,修改如下 include define max 200 int a max b max cnt 0 void read void void js void for i 0 i void main 你要說說你的這程式解決的是用來做什麼的啊 給你改好...