c 函式中的指標引數跟地址引數區別

2022-04-02 23:28:46 字數 3737 閱讀 8277

1樓:湯靈杉

chat(int&a);

chat(int *a);

這兩個函式是完全不同意義的東西,你的理解主要是在int&a和int* a這個型別上面。要注意int&和int*是兩個完全不同的型別。int&是引用型別,而int*是指向int型別變數的指標型別。

void chat(int&a)

呼叫此函式:

int x=100;

chat(x); // 此時x的值變為20了

如果函式如下:

void chat (int*a)

呼叫:int x=10;

chat(&x); //此時x的值也會變為20;

這是他們有聯絡的地方,也就是他們都可以在函式裡面改變外面變數的值,但是這兩個的引數傳遞方式是不一樣的void chat(int&a)這個函式是引用傳遞,而void chat(int*a);這個函式是值傳遞(雖然其傳遞的值是地址值,但是還是值傳遞)。

這個引用型別應該怎麼理解呢? 我是這樣理解的:int a=100;那麼a到底是個什麼東西,我們說a使我們定義的一個變數,那麼變數又是個什麼東西呢,不知道你有沒有想過,我們不談編譯原理,但是你可以將a看成是這麼一個東西,a代表了一塊記憶體空間,注意:

是一塊記憶體空間,也就是說這一塊記憶體空間可能由一個或多個位元組組成,那麼在vc++ 6.0中,int型別的變數佔4個位元組,所以a代表了4個位元組的連續的記憶體空間。那麼int &b=a;定義了這一句之後,b和a一樣都代表了那4個位元組的記憶體空間了。

再看看int *c=&a;此時c是什麼呢?c也代表了一塊記憶體空間,在vc ++6.0中int*型別的變數佔4個位元組的記憶體空間,所以c代表了一個連續的4個位元組的記憶體空間,在其內部放的值就是a代表的那塊記憶體空間的第一個位元組的地址值。

所以我們向chat(int&a)傳遞引數的時候例如chat(x)此時a與x同樣代表一塊記憶體空間,而chat(int*a)呼叫的時候:chat(&x);此時a裡面的值就是&x,也就是x代表的記憶體的首地址。

所以你要明白,他們不是傳遞的都是地址!!!!! 在c++中地址和引用不是一個東西!!!

2樓:玉中半

地址引數存在棧中,指標存在堆中

3樓:匿名使用者

第一個引數是一個link型別的引用,而不是地址形參引用傳遞指向實參,不產生副本

指標傳遞產生一個指標副本,該指標指向實參

普通引數產生一個副本,該副本儲存了實參的值

4樓:匿名使用者

你要明白指標就是地址這個概念,其實, 指標就是一類變數,是一類包含了其他變數或函式的地址的變數。與其他變數所不同的是,一般的變數包含的是實際的真實的資料,而指標是一個指示器,它告訴程式在記憶體的哪塊區域可以找到資料。

因此,你所引用的第一個函式中的引數&a,本身就是一個指標,所以跟第二個函式中的是一樣的

5樓:匿名使用者

兩個函式的宣告不一樣的,

第一個是以一個link型別的引用作為函式引數。

第二個是以一個link型別的指標作為引數,這個是傳地址。

c++引用,指標和一般變數在當做函式引數時的區別

6樓:

引用就是給被引用變數起別名,其實是被引用變數本身,指標就是把存放變數的地址傳過去了,

這兩個當引數傳入時,對他們的修改都會影響到變數本身。

一般變數就是最簡單的值傳遞,就是把變數的值傳過去了,變數本身沒過去,所以對形參的修改,不會影響到變數本身。

朋友,請【採納答案】,您的採納是我答題的動力,如果沒有明白,請追問。謝謝。

7樓:

引用:傳遞的是常量地址

指標:傳遞的是可變地址

你可以認為引用是一種安全指標

絕對大部分情況下,不管是引用還是指標,都可以達到相同的功能我一般是對引數種類區分,需要修改傳入引數的值就用指標,否則用引用

c和c++中指標和地址的區別

8樓:硪丨曖戀

指標總共可以分為兩種,函式指標和資料指標。而指標和地址最大的區別就是指標是有型別的,地址是沒有型別的。我們當然可以通過絕對地址的方式找到函式和資料,但是地址是沒有型別的,不能對地址進行算術操作,在涉及諸如陣列等操作時就不能通過地址的自增和自減來訪問陣列的各個變數。

但是通過對指標的引用,就可以通過對指標進行一系列的加加減減操作很方便的訪問陣列的各個元素。

所以,指標是由地址和型別兩部分構成的,指向資料的指標不僅記錄該資料的在記憶體中的存放的地址,還記錄該資料的型別,即在記憶體中佔用幾個位元組,這是地址所不具有的。指向函式的指標不僅記錄函式的入口地址,也記錄該函式的型別,即函式的返回值型別和該函式的引數型別。

在c++中還有一種特殊的資料型別,那就是物件,這是一種使用者自定義的資料型別。它即包含了資料,又包含了函式。但是在同一個類别範本宣告的物件變數各自擁有一份資料成員,卻共享一份函式成員,因為對有共同類别範本的物件來說,他們的資料成員可能不同,但是他們的用來處理資料的函式**確是相同的,所以他們共享一份成員函式。

而此時,物件的指標指向的各自的資料成員。

指標的使用一定要特別小心,千萬不能越界,否則會出現意想不到的結果。而且一定不要使用未初始化過的指標,這樣將會訪問到位置的記憶體,有可能會給作業系統帶來毀滅性的災難,雖然健壯的作業系統一般不會允許這麼做。

c++ * a和*&a作為函式的引數時有什麼區別

9樓:匿名使用者

既然你自己都已經知道了,我就不說這個了。

但我想多說一層。既然你學了c++,就應該儘可能使用引用,而不是指標。如果你不準備使用c++, 那麼對於你這樣的**,你應該改為void foo2(int ** ptr)去達到你的目的。

因為指標雖然靈活。但是他可以被持有者釋放記憶體。這是個很大的問題。如果兩個指標變數分別持有一塊記憶體。那麼當其中一個釋放了這塊記憶體之後,另一個指標的存在就是個問題。

當然,你若使用引用,便沒有這個問題了。

c語言中 關於函式形參的指標和地址的問題

10樓:談瑾高荷

void

sort(int

&a,int

&b)用c基礎講般c++才用說白傳遞址已

要記住用實參形參記憶體址函式改變引數值影響主函式值

11樓:匿名使用者

void sort(int &a,int &b)

這個用法在c基礎中不講,一般在c++中才用到,說白了,就是傳遞一個地址而已

不過你要記住,這樣用時,實參和形參在一個記憶體地址中,在子函式中改變引數的值,會影響到主函式的值

12樓:匿名使用者

你們老師太水了吧

兩種都可以 用的不同的知識點

你用的是c++中的引用

教程上的是傳地址交換值的典型程式

所以都行。

13樓:匿名使用者

對於你這程式,兩個都是可以的。

這是引用和指標做引數的區別,理解一下吧:

1.兩者都可以不用複製變元而提高效率,但是指標的傳遞實際上是複製了指標的,而引用沒有複製。

2.雖然兩者都可以改變變元的值。但是如果函式引數是指標那就是明顯暗示傳入的值可能被改變,而傳引用沒有這個暗示。

3.指標引數可以接收空值,而引用必須要指向一個值。

4.沒有被宣告為const的引用不能傳遞常量,因為編譯器不允許建立對常量的引用。

5.指標需要解除引用才能獲得或操作它指向的變數值,而引用不需要這一步。

c語言fwrite函式中引數buffer為什麼要用

用陣列名錶示第一個陣列元素的地址,也即陣列的起始地址,對於其他陣列元素,還是需要取地址符的 fwrite函式具體是什麼意思怎麼用各個引數是什麼意思 size t fwrite const void buffer,size t size,size t count,file stream 這是fwrit...

C 預設引數的問題,C 中函式預設值的問題

定義函式 void f int q,int w,int e 0 e 0 就是預設實參,呼叫函式時f 1,2 這時e 0 後面的是說不能寫成這樣 void f int q,in w 0,int e 比如一個函式宣告void f type p1,type p2,type p3,type p4 如果要使用...

C中很多函式的引數加?,表示可為空,比如DateTime的,這樣會導致我插入資料庫的時間顯示預設時間

c 中很多函式的引數加?表示可為空,比如datetime的,這樣會導致我插入資料庫的時間顯示預設時間?dbnull.value 是資料庫中的null加?的原因是因為這個欄位在資料庫中可能為null基元型別的預設值一般是0 引用型別的預設值為null 想datetime雖然屬於值型別,但是他不屬於引用...