⑴ c語言里調用自定義函數時數組是傳值還是傳地址
數組么?一般用指針來傳遞以便用來讀取數組。但一般的函數參數的傳遞時值傳遞。
⑵ 計算機C語言傳值傳址的問題。。希望有解析和例題
傳值,若在函數中改變了該值,原值不變,因為傳進來的是個副本;
傳址,若在函數中改變了該值,則原值也變,因為傳進來的是地址,則在函數中的操作相當於直接操作該值
⑶ c語言關於傳值與傳址的問題
給你來點通俗點的:
有個關鍵的東西你沒有考慮到,函數里的a與函數外的a並不是一個a,請看:
int
a
=
3;
int
b
=
5;
void
fun(int
*A,int
*B)
{
int
*C;
//
1
C=A;
//
2
A=B;
//
3
B=C;
//
4
}
fun(
&a,
&b
);
我們來看一下,運行1,2,3,4句話的結果
1.
int
*C;
+
&a
0x00424a30
int
a
+
&b
0x00424a34
int
b
+
A
0x00424a30
int
a
+
B
0x00424a34
int
b
+
C
0xcccccccc
2.
C=A;
+
&a
0x00424a30
int
a
+
&b
0x00424a34
int
b
+
A
0x00424a30
int
a
+
B
0x00424a34
int
b
+
C
0x00424a30
int
a
<--改變
3.
A=B;
+
&a
0x00424a30
int
a
+
&b
0x00424a34
int
b
+
A
0x00424a34
int
b
<--改變
+
B
0x00424a34
int
b
+
C
0x00424a30
int
a
4.
B=C;
+
&a
0x00424a30
int
a
+
&b
0x00424a34
int
b
+
A
0x00424a34
int
b
+
B
0x00424a30
int
a
<--改變
+
C
0x00424a30
int
a
從上面的調試結果可以看出來,&a
&b的值一直沒有改變,在改變的只是函數內部A
B的值。一旦函數結束,a,
b的值是不是還是沒有改變?
在進入fun之前,會有個拷貝的過程
A
<->
&a,
B
<->
&b,很多時候都是會將外部變數和參數寫成一樣,就很容易造成困擾,其實函數內外根本不是一個東西。
A
和
&a
都指向同一個地址是沒有錯,但你把A的指向改變下,&a的指向你可是沒有變吧。
換一下,用
*A
和
a來比較
A指向的那個內容就是a,修改*A就是修改a
所以在一些情況下(如COM中),就會有一些函數的參數是
void**
ppObj,只有這樣才能將傳進去的一個指針的值改變。
⑷ c語言 是傳值 還是傳址的
傳值和傳地址的區別在於函數是否對形參分配內存。
C的函數對簡單變數和指針形參分配內存,所以是傳值。
但數組作參數,因為數組對內存要求比較苛刻並消耗大量內存,所以不再分配空間,而傳地址。
數組傳地址的例子:
#include<stdlib.h>
#include<stdio.h>
void f (int a[3]){a[0] = 1; a[1] = 2; a[2] = 3;}
void main()
{
int a[3];
(void) f(a);
printf("%d %d %d\n",a[0],a[1],a[2]);
}
正因為傳地址,所以能把函數運算結果帶回主程序。
我估計,對於結構也是傳地址。
⑸ 在c語言中,指針作為函數參數,形參只能傳遞值,而不能傳遞地址,是怎麼回事
建議上代碼
問題中說法本來就是錯的
形參指的是你聲明或者定義用的那個參數,本來也不是傳值的
至於傳值還是傳地址,如果形參是指針p,那麼傳遞過去的p值就是地址,同時也是自身的值,這個看具體使用情況
所以一句話,show me your code
⑹ C語言傳值傳址選擇題
這是C++代碼啊,好吧雖然用的是C語法而已
你也說了啊,是傳值調用,傳值調用的特點是什麼?形參永遠是實參的副本,即形參的任何動作都不會影響實參本身
基於此,swap_str函數形參指針ab無論值為多少,原實參str_a, str_b都不會發生變化啊,但是實參指針指向的內容就不一定了,此處是也沒有變化
P.S. 既然都用到C++了,順帶講下,C++的函數用引用調用的,與傳值調用不同
⑺ C語言:為什麼第一個函數是傳址調用第二個函數是傳值調用並沒有看出它們的調用方式有哪些區別
第二個程序傳入的t是主函數中a的一個副本(也就是所謂的值傳遞,傳入到子函數中的是a的值),所以,t的變化與a無關
而
第一個程序中傳入的a是個數組名,也就是是個地址,a【1】=b就是將b中的數據存入了a地址中,所以,能通過a帶回到主程序中。
⑻ 一道c語言解答函數返回多個值,用全局變數,傳址參數,和返回結構體變數,他們之間的優缺點在哪,求解答
全局變數:
優點:變數在各個函數間自由調用和賦值,不需要考慮各個函數直接的傳值問題,程序簡單。
缺點:①資源佔用多;②函數的移植性差;③全局變數用的多容易混,程序員記憶量大,有時需要列一個變數表。
結構體變數:
優點:方便。
缺點:使用范圍受限,如果幾個返回值正好是某個已有結構體變數的內容,那才是不二的選擇。如果單獨為了返回幾個值而定義一個結構體變數,則得不償失,增加編程的工作量。所以這個方法用的少。
傳值參數(指針):
優點:用傳值參數(指針)回傳返回值是最常用的方法,需要哪一個值回傳,就定義哪一個變數的指針,用完就把內存收回來了,執行速度快,程序直觀,函數的移植性好。
缺點:要熟悉指針的使用,別搞亂套。定義指針,增加了一些工作量。
⑼ C語言問題 怎麼看函數是傳地址還是傳值,這個程序結果為什麼不是5,3,5,3
傳入的值和地址主要看形參是指針類型還是其它值類型
傳出的值可以看return的是什麼,也可以看函數類型
比如 :
int*a(intb);
inta(intb);
inta(int*b);
傳入傳出分別是
值/指針
值/值
指針/值
⑽ C語言 傳值 傳址 傳引用
我來詳細解釋一下: void test1(int a)
{
a = 100; //這里的a是根據參數a而構造出的一個副本,暫存於棧中,與實際參數a完全處於不同內存。
//當函數退出時,a自動無效,修改a的值只是修改棧中這個a的值,無法修改實參。
//如果使用的是C++傳遞的是一個類的話,同樣需要構造一個副本,函數退出時也會析構
//該副本,因此會加大構造和析構的開銷,同時會加大內存開銷用於保存臨時副本
}void test2(int* a)
{
*a = 1000; //這里的a和傳值一樣,也是構造的一個副本,不過這個副本是一個指針,同樣暫存域棧中
//同樣需要加大創建這個指針副本的內存,32位機器為4位元組,即存放這個副本用的
//同樣與實參a指針處於完全不同的內存
//但是,雖然這兩個指針處於不同內存,他們指向的地址卻是同一個地址
//我們通過*操作符來解析指針指向的地址的值(簡稱解引用)
//*a = 5;這句代碼的意思是將副本a指向的地址的值改變為5
//由於副本a指向的地址與實參指向的地址相同,即改變了實參指向的地址的值
//因此實參a指向的地址的值變成了5 //可以解釋的形象一些,
//假如實參a自身處於內存0x01,它指向地址0x03
//那麼這個副本處於的內存不會是0x01(因為它是構造出來的一個副本指針),我們假設它自身地址
//為0x02(只是假設,這個地址值肯定是在棧當中的),而它指向的地址一樣是0x03
}void test3(int* a)
{
int tmp;
a = &tmp; //接著test2講,由於這里的a是一個構造的副本,如果我們改變它,讓它指向tmp的地址
//就不會改變實參指向的地址的值,這里只是將副本指向的地址改變了而已 //解釋的形象一些,
//同理假設實參a自身內存為0x01,它指向地址0x03
//這里的a的自身內存為0x02,它也指向地址0x03
//tmp地址為0x04
//a = &tmp;這句代碼的意思是讓a指向tmp的地址,即副本a指向了tmp地址0x04
//而實參a指向的地址的值沒有發生任何變化
*a = 10000; //這里對形參a的任何操作已經於實參a毫無任何關系了
//因為它自身地址是0x02,它指向的地址是0x04
}void test4(int& a)
{
a = 100000; //這里的a與實參a完全一樣了,在這里對a的任何操作等價於對實參a的操作
}
void main()
{
int a = 1;
int b = 2;
int c = 3;
int d = 4; printf("操作前各值\na:%d\tb:%d\tc:%d\td:%d\n", a, b, c, d); test1(a);
test2(&b);
test3(&c);
test4(d); printf("操作後各值\na:%d\tb:%d\tc:%d\td:%d\n", a, b, c, d);
} 附圖: