當前位置:首頁 » 編程語言 » 傳地址和傳引用c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

傳地址和傳引用c語言

發布時間: 2022-10-21 02:57:29

Ⅰ 在c++中,傳引用調用等同於傳地址調用

功能上類似,均是可以把對象的值回傳給主調函數。
但實際上還是有區別的。
1 系統開銷不同。
傳引用時,系統對傳過來的參數不會有任何額外開銷,直接使用原始變數的內存空間。
傳地址時,本質上是傳遞了一個指針變數。為存儲這個指針變數,在函數調用時,是要開一個指針類型的變數空間的。

2 形式不同。
要傳遞類型為T的對象值:
a. 傳引用時, 函數參數需要寫做T&a; 調用函數時直接傳遞對象本身;在函數內賦值的時候,直接對a賦值即可。
b. 傳地址時,函數參數需要寫作T*p; 調用函數時需要傳入對象地址; 賦值時需要對*p賦值。

從以上對比可以得知,傳引用調用比傳地址調用更為簡單高效。之所以保留傳地址調用,主要是為了兼容c語言的代碼。在C++編程時,應盡量以傳引用代替傳地址。

Ⅱ 誰能說一下C語言參數傳值和傳引用是什麼概念,謝謝!:)

你好,首先糾正一下你的一個錯誤,C語言里沒有引用的概念。引用就是一個別名,定義一個變數a,再定義一個引用c,即 int &c = a;就是給a變了個別名,實際上是一個實體。傳值就是將變數的值復制一遍,在函數調用棧上使用,還有一個傳指針,即傳變數地址,就是將變數的地址傳到函數棧上去,這樣,函數在棧上執行對該變數的操作都會直接操作到原變數的值。傳引用和傳指針都能直接改變原變數的值,而傳值不能修改原變數,只能修改它們的復製品(即在棧上建立的變數並被賦予了傳進來的變數的值);

Ⅲ 在c語言編程中,傳值方式和傳引用方式之間有什麼區別

在C語言中,並沒有引用的概念,這個是C++的概念。
在C++的函數參數中,有兩種形式,其中
TYPE & var的形式,稱為傳引用方式;
TYPE var的形式,稱為傳值。
二者的區別為,當傳引用時,實際傳到函數中的形參,是實際參數的一個引用,而不是僅傳遞值到函數中。具體的表現有以下幾條:

1 傳引用時,形參和實參是同一個變數,即使用相同的內存空間,二者有相同的地址。而傳值時二者地址不同;
2 傳引用時,由於沒有新建變數,所以對於類對象參數,不會產生構造和析構。而如果是傳值調用,調用時會進行構造,退出函數時會進行析構;
3 由於傳引用使用的是原本實參的地址,所以對引用參數值的修改,會在退出函數後體現在主調函數中,而傳值調用對參數的修改不會影響到主調函數。

Ⅳ 誰能說一下C語言參數傳值和傳引用是什麼概念,謝謝!:)

你好!
傳值只是把這個變數的值賦給形參,改變形參的值,實參不變。傳引用時改變形參,實參也會改變。
希望對你有所幫助,望採納。

Ⅳ 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);
} 附圖:

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

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

Ⅶ 請問:C++中的引用和C語言中的地址傳遞有什麼區別

引用相當於給 原來的變數取個別名 就像給人取外號一樣 地址傳遞就是指針了

Ⅷ C語言里的傳地址引用問題

c語言參數是不能改變的,這是基本規則。試圖改變變數地址值,是不允許的。地址裡面存放的內容,才是可以改變的。
swap(int *p1,int *p2)
{int t;
t=*p1;
*p1=*p2;
*p2=*p1;
}
要改變地址,要用指針的指針。
int **p1,int **p2

Ⅸ 在c語言編程中,傳值方式和傳引用方式之間有什麼區別

在C語言中,並沒有引用的概念,這個是C++的概念。
在C++的函數參數中,有兩種形式,其中
TYPE
&
var的形式,稱為傳引用方式;
TYPE
var的形式,稱為傳值。
二者的區別為,當傳引用時,實際傳到函數中的形參,是實際參數的一個引用,而不是僅傳遞值到函數中。具體的表現有以下幾條:
1
傳引用時,形參和實參是同一個變數,即使用相同的內存空間,二者有相同的地址。而傳值時二者地址不同;
2
傳引用時,由於沒有新建變數,所以對於類對象參數,不會產生構造和析構。而如果是傳值調用,調用時會進行構造,退出函數時會進行析構;
3
由於傳引用使用的是原本實參的地址,所以對引用參數值的修改,會在退出函數後體現在主調函數中,而傳值調用對參數的修改不會影響到主調函數。

Ⅹ 在c語言編程中,傳值方式和傳引用方式之間有什麼區別

傳值方式:
當一個函數是傳值方式的時候,你調用這個函數的時候傳入的實參的值會被拷貝到形參,
但是形參與實參之間並沒有什麼聯系,比如變數b=5,a=b;這個時候將b賦值給a,他們的值相等,但是當這以後無論a的值怎麼改變都不會影響到b,b=5,a=b;a=1;這時候b依然是5,這就是傳值方式
#include<stdio.h>
void add(int a,int b)
{
a=a+b;//改變了形參a的值
return a;
}
void main()
{
int a=1,b=2;
printf("%d\n",add(a,b));//3
printf("%d\n",a);//1
printf("%d\n",b);//2
}
傳引用方式:
當你調用一個函數時,傳入的是實參的地址的時候,這時候修改形參,實參也會受到影響,不過這種傳地址某種意義是傳值,首先將實參的地址拷貝到形參,他們兩個以後就沒有關系了,你也可以改變形參保存的地址,實參的地址不會改變,但是你操作的是形參對應地址的內容,與實參對應地址的內容一致,操作是同一個對象,所以形參對這個地址的操作,在實參那裡也會看到效果
#include<stdio.h>
void add(int *a,int *b)
{
*a=*a+*b;//改變了形參a的值
return *a;
}
void main()
{
int a=1,b=2;
printf("%d\n",add(&a,&b));//3
printf("%d\n",a);//3
printf("%d\n",b);//2
}