C語言傳值傳址選擇題,C語言傳值傳址選擇題

2022-05-04 23:58:51 字數 6069 閱讀 2085

1樓:匿名使用者

這是c++**啊,好吧雖然用的是c語法而已你也說了啊,是傳值呼叫,傳值呼叫的特點是什麼?形參永遠是實參的副本,即形參的任何動作都不會影響實參本身

基於此,swap_str函式形參指標ab無論值為多少,原實參str_a, str_b都不會發生變化啊,但是實參指標指向的內容就不一定了,此處是也沒有變化

p.s. 既然都用到c++了,順帶講下,c++的函式用引用呼叫的,與傳值呼叫不同

2樓:匿名使用者

void swap_str(char *a, char *b)改為這樣就可以了。

函式體表達的含義為:交換指標a、b指向的值。

而你的函式體表達的意思是,交換指標a、b的值,它們只是str_a, str_b位址的乙個副本而已。就算交換了也只是形參的交換,沒用

但是交換指向的值,實際上就算操作了實際的str_a, str_b

3樓:異世血

#include using namespace std;

修改

int main()

4樓:匿名使用者

這是乙個典型的錯誤。

首先你可能需要了解 臨時變數 的具體含義

1. 對於swap_str函式,接收了兩個指標引數a和b。對於a,它指向str_a指向的記憶體,b指向str_b的記憶體。

2. 在函式體內,又有temp指向了a指向的記憶體(即str_a指向的記憶體)。然後是關鍵:

a = b; // 現在a指向了str_b指向的記憶體b = temp; // 現在b指向了str_a指向的記憶體函式執行完後,變數a, b, temp都被釋放了;

問你,str_a和str_b指向的記憶體值改變了嗎,事實是沒有,所以當然不會交換。

你真要這樣做的話,可以傳入指標的引用,其它不變:

指標和引用對於初學者 確實可以糾結好一會……

5樓:匿名使用者

其實你就沒有理解, 傳值的內在意義, 什麼叫做傳值?

你的str_a, str_b 也是傳值的, 所以, 你懂得, 為啥沒變了。

利用位址來傳變數時, 是希望能夠改變位址所指向的內容,而不是位址本身, 位址本身也是乙個值。

而你這裡, 如果把位址看成整數(實際上就是整數, 不同用途的整數),那麼你這裡, 跟上面的ab沒有任何的區別,

能理解嗎?

6樓:匿名使用者

函式中只對位址進行操作,這裡的位址並沒有對實際資料進行操作

指標變數實際上也是乙個變數,用來儲存指標,和普通變數並沒有區別

樓主交換的只是指標變數的值,實際上指標是值傳遞的,並非引用傳遞

7樓:

a 和b 變了嗎? 沒有的話,str_a str_b也不會變的

求c語言程式: 引數的「傳值」方式與「傳位址」方式程式設計練習

8樓:匿名使用者

#include

void value(double r1, double r2, double *bing, double *chuan)

int main()

9樓:匿名使用者

//下面提供乙個程式**供參考

#include

//計算併聯電阻,其中jieguo以引用傳遞,函式中修改後,直接改變原來的數值;

//r1,r2以數值的方式傳遞

//計算串聯電阻,其中jieguo以位址傳遞,函式中修改後,直接改變原來變數的數值;

//r1,r2以數值的方式傳遞

void jisuan_chuan( double *jieguo, double r1, double r2)

int main()

10樓:匿名使用者

#include

int subfun(int arg1,int arg2)

int main()

11樓:匿名使用者

#include

// sub-function for calculate// parameter: r1, r2// return value: bing, chuanvoid calc(double r1, double r2, double *bing, double *chuan)

int main()

c語言關於傳值與傳址的問題

12樓:鬱童靳州

給你來點通俗點的:

有個關鍵的東西你沒有考慮到,函式裡的a與函式外的a並不是乙個a,請看:

inta=3;

intb=5;

void

fun(int

*a,int

*b)fun(

&a,&b

);我們來看一下,執行1,2,3,4句話的結果1.int

*c;+

&a0x00424a30

inta+&b

0x00424a34

intb+a

0x00424a30

inta+b

0x00424a34

intb+c

0xcccccccc

2.c=a;+&a

0x00424a30

inta+&b

0x00424a34

intb+a

0x00424a30

inta+b

0x00424a34

intb+c

0x00424a30

inta

<--改變

3.a=b;+&a

0x00424a30

inta+&b

0x00424a34

intb+a

0x00424a34

intb

<--改變+b

0x00424a34

intb+c

0x00424a30

inta

4.b=c;+&a

0x00424a30

inta+&b

0x00424a34

intb+a

0x00424a34

intb+b

0x00424a30

inta

<--改變+c

0x00424a30

inta

從上面的除錯結果可以看出來,&a

&b的值一直沒有改變,在改變的只是函式內部ab的值。一旦函式結束,a,

b的值是不是還是沒有改變?

在進入fun之前,會有個拷貝的過程

a<->

&a,b

<->&b,很多時候都是會將外部變數和引數寫成一樣,就很容易造成困擾,其實函式內外根本不是乙個東西。a和

&a都指向同乙個位址是沒有錯,但你把a的指向改變下,&a的指向你可是沒有變吧。

換一下,用*a和

a來比較

a指向的那個內容就是a,修改*a就是修改a所以在一些情況下(如com中),就會有一些函式的引數是void**

ppobj,只有這樣才能將傳進去的乙個指標的值改變。

13樓:匿名使用者

不能企圖通過改變指標形參的值而使指標實參的值改變。

14樓:黃邦勇帥哥哥

記住關鍵:函式內部的變數與函式外部的變數是相互獨立的。

函式是傳址進去的,但是在函式內部,你只是交換了區域性指標a和b的位址,而沒有交換到p和q指標所指向的位址,同樣也沒有交換到x和y的位址,因此最後輸出的是沒有交換的值。

15樓:匿名使用者

函式呼叫不改變傳進去的實參的值,你的函式是void fun(int *a,int *b),在返回時不改變傳入的實參fun(p,q)的值。你可以改為:

void fun(int *a,int *b)

這樣你改變的是指標指向元素的值,並沒有改變指標的值。

16樓:

void fun(int *a,int *b)

你只是改指標,沒改值,沒有意義

改為:void fun(int *a,int *b)

17樓:匿名使用者

有問題問啊,問了才回答啊!

c語言 傳值 傳址 傳引用

18樓:匿名使用者

我來詳細解釋一下: void test1(int a)void test2(int* a)

void test3(int* a)

void test4(int& a)

void main()附圖:

19樓:匿名使用者

傳址這種形式中,若你在子函式中修改了形參位址,實參的位址是不變的

你說的對的,就是傳值的話只是作用於函式內,傳位址才能真正修改數值

20樓:匿名使用者

呵呵 傳址是將實參的位址傳遞 給了形參 也就是說形參裡儲存的是實參的位址 而形參本身也分配了記憶體空間 也會有自己的位址 所以你改變形參的位址 是不會改變實參的位址的

而傳值則是將實參的值傳遞給了形參 在形參中有乙個和實參相同的引數 而改變形參的值 是不會改變實參的值

傳引用則是將實參從新定義了乙個別名 對形參的的改變等於就是對實參的改變 不知道我的回答你能理解不 呵呵'

希望對你有所啟發

c語言傳值傳址的問題

21樓:匿名使用者

首先是c語言的引數傳遞機制,比如下面這樣的乙個簡單函式int plus(int a,int b)//..

//其它函式中呼叫

z=plus(x,y);

這個函式呼叫的過程中會進行引數拷貝,也就是說上述**會被編譯成大致如下的樣子(以下為偽**)

int plus

//...

fun(&x,&y)

在編譯的時候同樣遵循引數複製原則,變成如下**(以下為偽**)fun{

int* a;int* b;//引數a,b仍然是函式的內部變數,不過其型別是int*

將x的位址複製給a

fun:b=&y;//同上

fun();.//執行函式

可以看到,引數仍然是「複製」進去的,但要注意,傳入的引數&x與其引數副本a雖然是兩個東西,但他們是指標,儲存的位址一樣,也就是指向的物件時一樣的(都是x),&y與b同理,因此在函式內部通過指標a,b定址就可以訪問函式外部的變數x,y,並對其進行交換操作

22樓:小神秘闖闖

因為接收的是要更改資料位址,只有知道了位址才能改變位址所指向內容的值,

23樓:一代天驕唐呵呵

你好,你一定是把fun(int *a, int *b)裡面的*a,*b和下面函式內部的*a,*b混為一談了,

int *a的意思是定義乙個指標變數,這個指標變數是a而不是*a,

為什麼要寫成int *a而不寫成int a呢?因為寫成int a你就不知道它是個指標型別的變數了,

int *a裡面的*號只是乙個標誌而已,就是為了告訴你a這個變數是指標型別的。

相信你一定在學指標吧,那老師一定說過,指標變數表示(指向)的是位址,也就是說這裡的a是表示乙個位址,那麼函式裡面的*a是什麼呢?當然是a所對應的位址裡面存放的東西咯。

再來看這個函式的意思:

c=*a;*a=*b;*b=c;

把a裡面的東西給c,把b裡面的東西給*a,把c給*b;相當於你我想互換東西,但是我們手裡同時只能拿一樣東西,所以我不能直接把我手裡的東西給你,因為那樣你手裡就有兩樣東西了,於是我們找來另乙個人幫忙,這裡就是c,c同時也只能拿一樣東西,現在c手裡時空的,我把東西給c,然後你把東西給我,最後c把東西給你,於是我們就完成了互換東西。

希望可以幫到你。

C語言選擇題,求詳解,C語言選擇題乙個,求詳解

答案 a.123 詳解抄 首先題目定義了 乙個bai字元陣列s,其中存du放了字串 123 隨後定義了字元型指zhi針p,並且dao使p指向字串s.之後,題目開始輸出結果,注意輸出方式 p 這是本題關鍵所在,根據運算子結合順序,先輸出 p,也就是字串第乙個字元 1 之後執行p 指標後移指向字元 2 ...

c語言分段函式的值,c語言分段函式的值

如下所示,include include include int main 為了避免手機上檢視時,版式錯亂,的截圖如下,如有幫助,煩請採納,謝謝!您好你的第乙個else if寫錯了,c語言使用 表示等於所以應為else if x 0 應該只有這裡錯了 希望對您有幫助 輸入數用scanf 函式 分段用...

c語言如何輸入絕對值符號,C語言中絕對值怎麼表示啊?

1 c語言沒抄有特殊的符號表示絕對 bai值du,絕對值需要用到abs函式,這個函式zhi所在的dao標頭檔案在stdlib.h中,函式的用法是 abs 數字 括號內數字可以是純數字也可以是變數。接下來如下寫一段語句演示用法 2 然後執行測試就可以看到計算的結果了,這裡算出了 5的絕對值為5 3 最...