當前位置:首頁 » 編程語言 » c語言值傳遞指針傳遞的區別
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言值傳遞指針傳遞的區別

發布時間: 2022-08-28 05:07:15

c語言的傳值與傳指針的問題

c語言中指針即地址,地址的傳值可以引起參數的變化。
比如:
&x,
&y是取這兩個變數的地址,作用空間在main函數里。然後函數調用把這兩個變數的地址傳遞到函數myadd中,在函數中的*a和*b分別是引用地址指向的變數值,等於是取到了x,y本身的值。在myadd中直接操作*a可以改變x的值。
通俗來說因為&x,&y表示的是x,y的地址。所以傳遞的是地址。意思就是說,函數可以通過地址引用變數。

② c語言中常出現 "值傳遞" "地址傳遞" "數組傳遞" 等概念 它們是什麼意思 有什麼異同點

1一般函數的形參和實參之間是值傳遞,傳遞的是數值,但不改變實參;2有指針參與的是 地址傳遞,就是賦予地址值,可以改變實參;3數組傳遞用於指針數組,和2的理解差不多;

③ 簡述什麼是值傳遞,什麼是地址傳遞,兩者區別

值傳遞,傳入變數的數值,函數不能改變變數的數值;地址傳遞,傳入變數的地址,函數可以根據變數地址,訪問變數,自然就能改變變數的值;數組傳遞,由於c語言數組和指針的處理方式一樣,數組傳遞就等同於地址傳遞,函數可以根據地址,訪問數組元素,自然就能改變數組元素的值。 #include "stdio.h"void fun1(int a)
{
a=1000;
}void fun2(int *p)
{
*p=1000;
}void fun3(int b[])
{
b[0]=1000;
b[1]=2000;
}void main()
{
int a=99;
int b[2]={1,2};
printf("a=%d\n",a);
fun1(a);/*值傳遞*/
printf("a=%d\n",a); fun2(&a);/*地址傳遞*/
printf("a=%d\n",a); printf("b[0]=%d b[1]=%d\n",b[0],b[1]);
fun3(b);/*數組傳遞*/
printf("b[0]=%d b[1]=%d\n",b[0],b[1]);}

④ 1. 用普通,指針和引用三種方法實現傳遞參數,他們的區別是什麼,他們的特點是什麼

先來個概括~~~
C語言中,所有的函數調用傳參,都是傳遞的一個值!不一樣的是,我們能利用這個值做什麼!

1. 普通傳參
比如 int test(int a),此處,傳遞一個int型數據a,我們獲得的是一個int型的值,比如5,僅僅只是一個int

數值,獲取不了傳參時那個變數的地址!比如
int a = 5;
int *p = &a; // 【1】 &a
test(a);在test函數中,無法獲取a這個變數的地址,就是【1】,僅僅得到了5這個值

2. 指針傳遞
int test(int *p);
此處傳遞的是,一個整形變數的內存地址,其實也是一個int數值,內存地址使用int型變數保存,比如0x77777,

就是一個int數值。
int a = 5;
int *p = &a; // 【2】 假設為0x77777
test( p );
此時,我們在test函數中,就可以根據p保存的地址0x77777來修改這個內存單元中的值,就達到了修改a的目的



3. 引用傳遞
int a = 5;
int &b = a; // a的引用
這個其實類似第2種方法,也是傳遞了地址,b相當於給a取了一個別名。
譚浩強書中所指的值傳遞和引用傳遞其實都是值傳遞,那樣寫書確實誤導新手。。。。

11: int a = 5;
00401578 mov dword ptr [ebp-4],5 ; 將5寫入a那個int內存單元

12: int &b = a;
0040157F lea eax,[ebp-4] ; 獲取a的地址
00401582 mov dword ptr [ebp-8],eax ; 【3】 此處類似【2】中,定義一個指針指向a的內存單元

⑤ 在C語言中,1、數組和指針的參數傳遞在過程和結果上有什麼區別,2、在使用時需要使用return么

結果應該沒有區別,傳遞的時候都是進行地址傳遞,只是數組在使用下標的時候會進行值傳遞。地址傳遞時不用return語句。

⑥ C語言:哪些是值傳遞哪些是地址傳遞

C語言沒有真正意義的地址傳遞,即使傳遞指針也只是傳遞的指針的值,
比如這里加入b 的地址是0x ffff;
實際上在point 函數內是產生了另一個名為p的指針, p 指向0x ffff ( 這個p 只是和main函數的p值相同而已,不是同一個。所以傳遞指針其實是傳遞的地址的值,還是值傳遞)
因此p + 3 不會影響main 函數的p, 如果要改變main的p, 必須:
Point(char** p)
{
*p += 3;

}
調用:
*p = b;
Point(&p);
總之,改變指針的值用二級指針(更高一級的指針,即該指針的地址)。

⑦ C語言中函數傳值調用和傳地址值調用的區別

傳值是吧實參的值「拷貝」給形參,運算中是對形參進行操作,實參的值在運算中不會發生變化
傳址是把實參的地址傳給形參,運算中是對實參進行操作,會改變實參的值

⑧ C語言中的值傳遞和地址傳遞

都是值傳遞,真正的引用傳遞是出現在C#中,當你傳指針的時候,實際上你傳的是指針所指向的地址值,也就是把地址值傳過去,但是這個地址值也是通過值傳遞過去的,即函數內的指針指向的地址值是原來的地址值的一個拷貝,但是由於地址值相同,所以你在函數內對該指針進行解指針並進行修改,你也修改了外部的那個指針的值(注意,修改的不是地址值)
*p
=
30;
那麼主函數內的值也變成了30,因為是對同一個地址存放的數據進行了操作

⑨ C語言,指針,地址值的傳遞

c語言中指針即地址,地址的傳值可以引起參數的變化。
比如:
&x, &y是取這兩個變數的地址,他們的作用空間在main函數里。然後函數調用把這兩個變數的地址傳遞到函數myadd中,在函數中的*a和*b分別是引用地址指向的變數值,等於是取到了x,y本身的值。在myadd中直接操作*a可以改變x的值。
通俗來說因為&x,&y表示的是x,y的地址。所以傳遞的是地址。意思就是說,函數可以通過地址引用變數。