c語言中指標和引用的區別,C語言中指標和引用的區別

2021-08-11 19:13:50 字數 4517 閱讀 4863

1樓:匿名使用者

指標,全稱為指標變數,是用來儲存記憶體地址的一種變數。程式中,一般通過指標來訪問其指向的記憶體地址中的內容(資料)。

引用,是c++中提出來的一種新的使用變數的方式,即,給實際變數起個別名,通過這個別名來引用實際的變數。標準c中不支援變數的引用。

這兩個概念沒有任何相關性。

指標是實實在在的變數,有自己的記憶體儲存空間,它可以指向任何有效的變數。

引用是一種形式、方法,定義的引用變數,實際上是原實際變數的另一個名稱(別名),引用變數本身沒有自己的實際儲存空間,操作引用變數,就是在操作實際變數。如:

2樓:匿名使用者

ct9789:

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

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

指標的定義:

例如整型指標: 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++)

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

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

卻可以。

3樓:匿名使用者

我建議你還是去看看 c++primer 這本書,專門有一小節是講指標和引用的區別的。

大師的書才是真理,別在這裡被誤導了~~~~

4樓:軍軍

引用是c++中才加入的概念。

c語言中,指標和陣列的區別和聯絡?

5樓:匿名使用者

區別:c語言把記憶體劃分成四個區,它把一般的變數和陣列等存在於記憶體中的棧區,所以陣列在c語言的定義中只是一組同型別的普通變數,即使這個變數有可能是指標。所以他的作用比指標小的很多,而指標可以指向任何區的任何資料,所以就會覺得指標和陣列名很像,但是必須要注意的是,陣列名只是指標中的一種,它是指標中只指向棧區的且指標的移動範圍是有限的,即陣列長度。

而且陣列在定義之初就已經有了自己的記憶體,一般的指標如果未指向某一個記憶體塊時,它是沒有自己的記憶體的,即所謂的野指標。

聯絡:如上面所說,陣列只是定義在棧區的一個連續變數,它的首地址就是一個指標。

總結:不僅陣列有指標,所有變數都有指標,指標說白了就是記憶體中的地址,就像一個房間必須有一個房間號。在c/c++語言中定義一個指標,就是在棧區開闢一個記憶體空間用來存放它指向的記憶體地址,然後給指標賦值,就是把地址值賦值給剛才開闢的記憶體空間,然後通過訪問該記憶體中的地址值來間接訪問該地址下存放的資料。

如果該地址值指向的是一塊靜態儲存區,如字串常量等,當然就不可以修改指向的內容啦。

經驗之談,樓樓加分啊

6樓:匿名使用者

指標就是一個裝地址的變數,陣列是記憶體中的一個區域,而陣列名是這個區域的首地址。也就是說你在定義指標的時候編譯器只分配了一個變數的空間(空間大小由記憶體地址長度決定),而定義陣列的時候編譯器分配了一段區域的空間(空間大小由[ ]裡面的數字和陣列的型別決定)。使用上你可以把一個地址賦值給指標,但是不能賦值給陣列名。

你可以直接給陣列裡面的變數賦值,這是安全的,因為記憶體已經申請好了,而給指標裡面裝個那個地址賦值就要小心了,因為指標裡面那個地址很可能會出錯。

7樓:匿名使用者

陣列 eg: a[10] 這個陣列名a就是一個指標,

那如果是在動態記憶體中建立一個陣列的話,是沒有陣列名可以被使用的,必須用指標(解引用)間接來呼叫,所以陣列和指標是分不開的

8樓:不再猶豫

一維陣列名可以看做一個儲存陣列首地址的常量,不可變。而指標是個儲存地址變數,可根據需要指向不同元素;宣告一個陣列,就可以對陣列相應的儲存空間內的資料進行賦值,修改;指標則是宣告後,必須先對指標賦予地址,然後對所賦予地址中的資料進行賦值,修改(注意越界)

c語言中指標在程式設計中有什麼作用,C語言中指標在程式設計中有什麼作用?

指標,太有用了,也最難管理的,好處多的是,比如,函式傳遞,引數是結構時,傳指標可以提高效能 可以通過傳遞和儲存指標,通過資料的相對位置來訪問資料,而不用定義不同的n個變數來,分別使用。比如 int a 10 那麼用a 0 a 9 即可訪問裡面的10個資料,而只需要知道a的地址即可,操作方便,而且在函...

c中指標怎麼用,c語言中指標怎麼使用

int p 宣告一copy個指向int的指標pint a a 3 p a printf d p 列印a的地址printf d p 列印a的值 p 4 改變a的值。printf d a 列印a的值為4 推薦看書 c和指標 這裡最好的回答吧,指標可不是一天兩天能夠學會的 c語言中指標怎麼使用?1 使用場...

C語言(不是C中指標的難題,C語言(不是C )中指標的難題?

不動態分配空間,只給個指標值的話,需要輔助的儲存單元char data0,data1,淺拷貝 include include define max chars 100 假設浮點數轉成字串最大長度是100個字元,可以自己修改 int main include int main include incl...