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 最...