1樓:匿名使用者
這與引數傳遞有關,swap(int x,int y),x,y是呼叫此函式時,兩個變數的一份拷貝,只有*x這樣定義,才是傳遞的地址。
知道計算機是怎樣儲存資料吧?
比如說:變數a的地址是12345, 12345中儲存的資料是2,也就是說a=2;
如果 swap(int x,int y)這種定義,那麼呼叫時swap(a,b), a的地址在傳遞給x時,可能是67890,67890中儲存的資料是2,這樣,x=2,函式結果之後,x,y交換實際上是把交換的值放在了67890這個地址中,而12345這個地址中的資料沒有發生改變。呼叫結束之後,由於x是臨時變數,結束時這個地址(67890)就釋放了。
而swap(*x,*y)這樣定義,傳遞的是a的地址值,即x值是12345,並不是傳遞2這個數值,*x就是對x指向的地址進行訪問;函式修改時,修改的是12345這個地址中的資料,即原呼叫函式中的變數指向的地址12345中的資料發生了改變,這才是真正的swap
2樓:川行天下
你理解指標是怎麼回事嗎?還有你懂區域性變數嗎? swap函式裡面的x y在函式呼叫完之後就消失了 所以你下面該怎麼輸出呢?所以用指標會比較好指標指向的是地址
3樓:百問誰度
形參不能改變實參啊
要通過指標指向的地址來改變
達到互換的目的
4樓:匿名使用者
基於他們說過的,我再補充一點。。。
對於函式呼叫的 形參,返回值,等等 都是存放在記憶體的棧區,只要函式執行完畢,系統立即釋放他們的儲存空間,也就是說,等到函式執行完,這個函式就不復存在了,何來的交換?所以。我們利用地址傳遞來搞定。。。
5樓:匿名使用者
首先,你的錯誤我可以理解,也是很容易犯的錯誤!
再說,原呼叫函式你應該挺明白的吧! 就是傳進去的是&x 和 &y;把交換 &x和 &y 裡的內容交換!!!
最後,「相當於把 x,y 的值傳給另外兩個儲存單元!!那兩個單元的地址跟&x 和 &y 的地址不一樣了!!所以不能交換主函式中x,y的內容!!!
6樓:
swap(int x,int y)
和傳進來的引數是兩個不同的變數,即使他們名字相同、例如void swap(int x,int y)int main(void)
裡面的兩個x兩個y其實是四個不同的變數的。
而你第一個傳的是指標,指標指向那個地址,改變指標指向的值也就改變了那個被指向變數本身的值。
so..
c語言用指標傳遞引數的問題 5
7樓:匿名使用者
#include
main ()
至於第二段**只是通過主函式呼叫另一個全域性函式來作,結果一樣。
不過你第二段**中#include卻寫錯了。
補充一點:如果要用指標或引用來交換變數數值,**卻不是像上面的用法。
就本問題來說:因為雖然交換了指標但指標所指向的變數卻絲毫沒有變化。
指標儲存了變數的地址,交換變數的值,必須用解引用後的指標才能辦到:
如:void swap1(int *x,int *y)void swap2(int *p,int *q)進一步說:這就是深複製和淺複製的區別。
8樓:匿名使用者
第一題,m=1,n=2所以先輸出了1和2,然後p指標指向m,q指標指向n。在r=p;p=q;q=r;進行指標值交換後,p指向了n的地址,q指向了m的地址。所以輸出了2,1。
第二題,第一次輸出的是p和q指向的物件,輸出3和5。
隨後傳入fun函式的是x和y的地址指標,但是隻是交換了指標值,這並不影響到主函式中的指標p和q的值。所以輸出來的數依然是3和5。
9樓:匿名使用者
第一題p=&m;// p存放變數m的地址,或者說p指向m
q=&n; // q存放變數n的地址
r=p; //r存放指向m的地址
p=q; //p存放指向n的地址
q=r; //q存放指向m的地址,結果p和q通過r交換了所指物件,p和q的內容改變了
第二題:
p=&x;q=&y; //p指向x,q指向y
fun(p,q); //p存放的內容(x的地址)通過函式呼叫傳遞給變數a,則a也指向x,同理b指向y
c=a;a=b;b=c; //修改變數a,b,c的內容,而這三個變數屬於函式fun,返回時被放棄
fun(&x,&y); //與上面用p和q呼叫的實質完全相同,函式中不操作變數指向的內容,而僅倒騰變數本身,對主程式中的x和y沒有影響,也沒改變p和q的內容
10樓:weida愛問
指標傳遞引數例項:
void fun1( int *p ) //此函式接受一個指標p,也就是說p是別人傳過來的一個int型別的地址
main()
希望能幫到你,望採納哈!
11樓:西瓜燉牛排
&x, &y是取這兩個變數的地址,作用空間在main函式裡。然後函式呼叫把這兩個變數的地址傳遞到函式myadd中,在函式中的*a和*b分別是引用地址指向的變數值,等於是取到了x,y本身的值。在myadd中直接操作*a可以改變x的值。
通俗來說因為&x,&y表示的是x,y的地址。所以傳遞的是地址。意思就是說,函式可以通過地址引用變數。
12樓:匿名使用者
很簡單的
實參裡面寫的是地址,形參裡寫的是指標,比如int *p=1; 有一個函式定義為f(int *p) 呼叫這個函式時用f(p) 這樣子
再舉個例子 如果int a=1; 呼叫f時要寫 f(&a) 這樣子 就這麼傳引數
c語言的傳值與傳指標的問題
13樓:星月小木木
c語言中指標即地址,地址的傳值可以引起引數的變化。
比如:&x, &y是取這兩個變數的地址,作用空間在main函式裡。然後函式呼叫把這兩個變數的地址傳遞到函式myadd中,在函式中的*a和*b分別是引用地址指向的變數值,等於是取到了x,y本身的值。
在myadd中直接操作*a可以改變x的值。
通俗來說因為&x,&y表示的是x,y的地址。所以傳遞的是地址。意思就是說,函式可以通過地址引用變數。
14樓:大林因
其實簡單來說, 如果createdata()和print()這二個函式是正確的, 你只要分別看一下createdata()和print()的函式原型:
1. int createdata(lcountry *head): 它的輸入引數型別是 lcountry *, 也就是country **, 而 "head"是country *型, 所以傳給createdata時, 應該取 &head, 也即為 country **型.
2. void print(country* p): 它的輸入引數型別就是country *, 而 "head"正是country *型, 所以只要給它傳 "head"就可以.
3. "head"和"&head"都是指標, 都是地址, "head"是"*head"的地址, 而"&head"是"head"的地址.
15樓:
createdata(&head)之所以需要雙重的指標,是因為這個函式是將引數作為輸出,而記憶體分配本來就是需要一個指標的,而且它是在函式體內分配的。如:s=(country*)malloc(sizeof(struct country)),如果想作為輸出的話,所以存入引數時必須取它的地址(也就是傳入指向s的指標,這就成了雙重指標了)。
如果你直接返回head的話,你就不能引用在函式體內的記憶體了,由於createdata函式是在函式體內分配記憶體的,也即是是棧記憶體,函式執行完就會被釋放了,如果直接傳入head而不是&head,並返回head就會引用無效記憶體。舉個例子:
//這樣使用正確
#include
void get(char **p)//雙重指標;int main()
/********下面的是錯誤的**********/#include
void get(char *p)//單指標;int main()
希望能幫到你
16樓:
createdata(&head) 這裡傳的是雙重指標,剛好和形參是匹配的。形式引數必需用雙重指標的原因是外層指標是值傳遞的是不可以修改的,現在要修改內層指標當然只能傳雙重指標了。
你這個 createdata的原理就是建立一些資料實體(並且連城連結串列),然後將第一個資料實體的指標傳出來。因為你要傳的是指標,當然只能是指標的指標來作形參構成引用傳遞了
17樓:雙魚座大叔
createdata(lcountry *head) //如果只是傳指標,那是形參,不會修改指標所指向的內容,傳指標的地址,就可以修改指標指向的內容
print(head);//這裡傳形參就可以,不涉及到修改指標,只是列印指標指向的內容
c語言中指標傳遞的問題
18樓:匿名使用者
根本性的認識錯誤,返回的是野指標,前面的正確是僥倖
char a[12][20] 是區域性動態變數,函式結束變數就不存在了
如果非要返回的話,改用靜態變數
#include
#include
char *change(int x);/*函式宣告放在外部*/
void main()
else printf("you put error month\n");
}char *change(int x)
;/*改用靜態變數*/
switch(x)
} 試一下這個
#include
#include
char *change(int);
void main()
for (i=0;i<20;i++)
printf("%s\n",b);
}else printf("you put error month\n");
}char *change(int x)
;switch(x)
}執行時 輸入 12,結果就不對了
解釋"january","february"...
這些內容本身是字串常量,是放在常量區的
執行到 函式change 時
char a[12][20] 是臨時分配的,內容是從常量區複製過來的,這個看一下編譯生成的彙編**就很清楚了
函式結束以後 a 就被釋放掉了,所以 a 原來的地址裡的內容就有不確定性
不可以直接使用
返回區域性變數
a 不要定義成 char a[12][20]
定義成 char *a[12]
這樣a 是指向常量區的指標,在編譯時就已經確定了,可以返回地址
#include
#include
char *change(int);
void main()
printf("%s\n",b);
}else printf("you put error month\n");
}char *change(int x)
;switch(x)}
c語言的指標問題,C語言的指標問題
printf c p 3 分佈來看,c是要列印輸出一個字元。p指向那個字元陣列,p就是字元 a 那麼 a 3是多少呢,a 1是b 2 是c 3 是d注意是 p 3 而不是 p 3 這是由區別的。是的。p 3。是對p指向的那個值加3,p開始是指向a的,故a加3後就是d了 而p 執行3次的話,是指標p本...
C語言指標問題,求教大神C語言指標的問題搞不懂求大神指教
include include include include include static char chongpai char static int pare const void const void static int allocateintegerarr const char size ...
c語言指標的賦值問題C語言指標的賦值問題
指標在用要注意初始化,例如 int p p為指標,地址是未知的,如果直接賦值 p a 這樣編譯可以通過,但是會產生警告,p的地址是隨機分配的,這樣對未知的地址賦值很危險,可能會覆蓋掉某些重要資料,所以避免這種危險,在定義指標時注意初始化,也就是賦值。可以int p a 或者int p p a 然後再...