通過形參指標變數改變實參指標變數

時間 2022-10-30 09:16:15

1樓:匿名使用者

swap函式修改成:

void swap(int *p1,int *p2)

補充:swap(pointer_1,pointer_2);

時編譯器重新生成了2個臨時變數:

swap(_pointer_1,_pointer_2);

其中,*_pointer_1 = pointer_1,*_pointer_2 = pointer_2

你要交換的是值,即交換的是,*_pointer_1 和*_pointer_2,因此上面的修改沒有錯誤.

你原來的**進行時:

假設,_pointer_1 位址為0x4444 _pointer_2位址為0x3333

交換後_pointer_2位址為0x4444, _pointer_1位址為0x3333,而pointer_1,pointer_2指標指向的位址沒有變化, 指向位址的變數沒有變化,也就是沒有達到交換的目的.

不知道給你解釋這麼多理解了沒有?

2樓:

void swap(int*& p1,int*&p2)//這裡程式設計指標的引用就好了

cout<<"max="<<*pointer_1<<"min="<<*pointer_2<

#include

using namespace std;

int main()

為什麼c語言不能通過執行呼叫函式來改變實參指標變數的值

3樓:小雨田大

呼叫函式,只能改變指標指向的記憶體空間的內容,不能改變實參指標變數的值。專

我覺得題

屬主對指標變數,還算有一點了解。

指標變數,其實也就是乙個變數,但它的值是一塊記憶體的位址。

函式呼叫時,你只是把實參指標變數的值,即一塊記憶體的位址,賦(複製)給了形參,然後,你在函式內把形參指標指向別的記憶體空間位址,與實參指標就無關了,實參指標還是指向原來的那塊記憶體空間。

另外,你把實參指標變數的值,賦(複製)給了形參,然後形參指標就能操縱這塊記憶體了,可以改變這塊記憶體的容。此時,實參指標指向的那塊記憶體的內容也就改變了,但實參指標的值還是函式呼叫前的那塊記憶體空間的位址。

4樓:匿名使用者

是可以的啊?你**有問題吧,發來看看

c語言中,形參指標變數的值改變不能使實參指標變數的位址發生改變,而可以改變它的值。請問這句話對麼?

5樓:匿名使用者

這個總共有兩個問題:

第乙個是「實參指標變數的位址」應該改為「實參指標變數的值」。實參指標變數的值是指該指標指向的變數的位址,而實參指標變數的位址則是該指標變數的位址,屬於二維指標了。

第二個是個語文問題:後面的「可以改變它的值」,這個它具體是指形參指標變數還是指實參指標變數呢?又或者是指實參指標指向的變數呢?

所以正確的說法是:

c語言中,形參指標變數的值改變不能使實參指標變數的值發生改變,而可以改變形參指標變數的值,也可以改變實參指標指向的變數的值。

o(∩_∩)o~

6樓:

正確,上**:

void fun(int* p)

int main(void)

執行一下,一目了然!

7樓:

正確。實參傳給型參的只是乙個位址,你可以改變位址裡的值。

8樓:周生

1.正確

2.使用二級指標,即傳指標的位址

形參不能改變實參,為什麼在用指標傳遞數值的時候又可以改變呢?

9樓:匿名使用者

樓主你好,要bai理解這個du必須理解乙個問題,就是指標的zhi定義dao。指標自己是

有乙個存版儲空間的,權裡面存的是被指的乙個數(如a)的位址。也就是說指標中存的是a的位址。呼叫函式的時候,通過指標找到a的位址,然後對a的值進行改變,也就改變了a的值。

其二是,我們普通的賦值(主函式中),a=2,其實並不是對a賦值,a只是乙個代號,a是指向a所在的位址,a只是乙個入口,就是對a所在的位址中的存的資料進行了改變。

如果在講a作為實參傳資料給形參b,這樣的話,就是把a位址中的資料傳給了b,呼叫函式中對b的賦值等,僅僅是影響到了b中的值,而沒有影響到了a的值。

形象的說吧,指標到最後是乙個東西,不管a還是b對這樣東西做修改,都會改變。而普通的是兩樣東西,b做修改的僅僅只是b的東西,跟a的沒有關係。

10樓:

是啊,形參不可能改變實參,可你傳遞指標,實際上就是相當於把這個引數實際位址給他了,而不是乙個拷貝,穿指標和穿實參的意義是一樣的,在一些沒有指標的語言 用 (ref 引數)來傳遞實參,實際傳的就是指標

11樓:匿名使用者

形參其實是在

bai把實參傳遞給子

du函式的時候定義了

zhi乙個新dao的變數,但是這個變數專的值和實參屬相等所以在子函式裡 無論怎麼修改都不會影響到呼叫它的函式的實參的值在用指標做引數的時候 因為傳遞的不是值本身,而是它所對應的位址,我們改變值的時候是改變那個位址裡的值 所以 傳遞指標的話 就能改變值了

如果你希望在子函式裡可以修改呼叫它的函式的值的話你可以使用引用函式就比如#include

void fun(int &x)

x = x + 1;

void main()

就是在引數前加了乙個&就行了

12樓:找乙個物理女

我談談我的看法,請多抄包bai涵。

首先搞清記憶體。記憶體裡面的東西du是不變的,zhi假設有兩個地dao址,位址為1的其數值為10,位址為2的其數值為20。而a和b只是從其中取值,並且p1,p2各是其位址,(雖然數值上p1,p2與1和2相等,但其本質並不同,也就是其服務的物件不同。

)現在p1,p2變了,也就是a和b取值的位置變了,所以其最後的數值變了,視覺上就形成了a和b實參交換數值的結果。!

這是我的理解,是基於記憶體的知識理解。

13樓:匿名使用者

指標傳遞的是位址,位址的值改變了,使得指標傳遞的值改變!實際位址沒變,變得是那個位址上的值!

14樓:匿名使用者

我說一下我的理解抄,以鑰匙和鎖為襲舉bai例值(鎖)

:當dua門有一把鎖a(值),b門複製

zhia門一樣的dao鎖,不管以後b門的鎖如何改變,都不會影響a門。

指標(指標);

這種情況下,只有乙個a門,傳送指標就好像複製了a門的鑰匙a,我叫做b鑰匙。這樣我有了a門的鑰匙b就可以隨意的改變門鎖a了(值)。

這是我的理解,歡迎指正。

c語言中指標函式可以改變實參的值嗎

15樓:俟澹尹和

c語言中形參與實參的關係是:形參是實參的值副本。無論引數的型別是什麼,傳遞到子函式中的形參只是實參的值。

所以,在改變形參變數自身的值時,是與實參無關的。換句話說,形參的改變不會影響到實參。

但,如果引數型別是指標型別,則可以通過對指標變數所指向的位址中的資料進行修改,達到改變實參位址中的資料目的。

因此,使用swap函式進行資料交換時,必須保證兩點:

1.引數必須是指標型別,指向待交換的資料

2.交換時,必須交換位址中的資料,而不是交換位址本身。

參考**:

//錯誤的交換**1

void swap1( int a, int b ) //引數不是待交換資料的指標

//錯誤的交換**2

void swap2( int *a, int *b )//正確的交換**

void swap( int *a, int *b )

指標的形參為什麼影響不了實參

16樓:緣見

你只是互換指標p1,p2的位址指向,沒有更改主函式中兩個指標指向位址的互換。

17樓:漫天闖天涯

形參對來實參沒有產生影響源 如果在形參之前新增上引bai用符號du&,也就是void swap(int * p1,int *p2)修改成輸出zhi的結果就是3,4了

你原dao來的程式只是把實參傳遞給了形參,但是函式作用的結果沒有通過形參返還給實參,所是說結果是4,3,當加上引用符號之後,實參才會隨著形參的改變而改變。求採納

18樓:匿名使用者

因為你傳入的是指標的內容,而不是指標本身。

例如m=4,在記憶體裡m的位址為回 0x8000,0x8000這個位址的內答存儲存了4這個數字。

int *pm= &m; 這句話會分配乙個位址給pm,例如位址為 0x3000,並在這個位址的記憶體儲存(0x8000)這個數,即造成了pm指向m。

平常使用指標時,*pm,意味著去取pm指向的位址的值(pm指向0x8000,0x8000上存了數字4)

你的函式只是把pm的值,也即是0x8000傳入,函式結果也不會把pm本身(即0x3000)的內容更改。

如果你把pm的位址傳進去,是可以更改的。

不知道這個解釋是否明白?

19樓:

在c中,所有的形參在接受實參時都是拷貝,即是」值「傳遞,所以在函式中對版」值「權所做的任何操作都不會影響原來的變數。有人認為指標傳遞能「影響原來的值」,這不僅是誤會,而且大錯特錯——其實在被調函式中對指標的任何操作都不會影響原來的指標值,只有對「指標指向的內容」操作,才會永久改變指標所指向的變數值。具體地說,如果形參指標p是由原調函式裡的指標a拷貝過來的,那麼函式對p的任何操作都不會影響a,而只有對*p(指標p指向的內容)的操作,才會影響到a指向的內容*a。

這一點好多初學朋友並沒有真正搞清楚。

20樓:匿名使用者

我來回答!

實參傳遞到形參的是它的位址

值,也就是它本身的值,不是它指向的值。

回c語言會開闢乙個新的內答存區域供形參運算,建立新的形參變數來運算。

形參變數和實參變數共用傳遞過去的地埴值,這個共用的位址值是指標變數型別的,它指向同樣的內容,這裡指4,3.

形參不帶星號的任何運算,改變的只是形參指標的位址和指向,而實參的位址和指向從始至終都沒有改變過,所以在main中輸出時,它們沒有變化。

試一下int temp = *p1;

*p1 = *p2;

*p2= temp;

執行後顯示 3,4

21樓:匿名使用者

int *tmp ;

*tmp=*p1;

*p1=*p2;

*p2=*tmp;試一下