1. 程式人生 > >辨析地址傳遞與值傳遞

辨析地址傳遞與值傳遞

作者想通過如下程式碼來為變數a申請記憶體,並將其指向的值改為5.

#include <stdio.h>
void foo(int * value)
{
    value=(int *)malloc(4);
    *value = 5;
}
int main()
{
    int *a=NULL;
    foo(a);
    printf("%d\n",a);
}

但是程式跑出來的結果是0,也就是說a這個指標變數中儲存的地址是NULL,根本就沒發生改變!

倒騰了半天,在百度知道上也發了問題。最終經過大牛指點程式碼修改為一下就可以了:

#include <stdio.h>
void foo(int ** value)
{
<span style="white-space:pre">	</span>*value=(int *)malloc(4);
<span style="white-space:pre">	</span>**value = 5;
}
int main()
{
    int *a=NULL;
    foo(&a);
    printf("%d\n",*a);
}
執行結果是5.

(不知道各位有沒有注意到第一段程式碼printf(...,a)第二段是printf(...,*a)。第一段如果寫*a的話就是記憶體報錯,因為a是空地址取不到值。)

弄完之後又查閱了一些資料,現在把地址傳遞與值傳遞辨析一下:

首先,C語言所有的傳遞都是值傳遞。

我們所謂地址傳遞只不過是指標變數之間的值傳遞。看下面的程式碼:

void swap(int *a,int *b)  //地址傳遞
{
 int temp;
 temp = *a;
 *a = *b;
 *b =temp;
}

引數傳遞過來以後,函式新建一個變數a複製第一個實參的內容(變數內容是地址),b複製第二個實參的內容(變數內容是地址)。

a變數與實參1都是指向同一個變數。所以*a發生改變當然是雙向的。b同理。

但是我們如果想修改實參1的內容(指標變數中儲存的地址)也就是文章一開始想給a申請動態記憶體就不能按照第一段程式碼來了。

需要按照第二段程式碼

#include <stdio.h>
void foo(int ** value)
{
<span>	</span>*value=(int *)malloc(4);
<span>	</span>**value = 5;
}
int main()
{
    int *a=NULL;
    foo(&a);
    printf("%d\n",*a);
}
傳遞指向a這個指標變數的地址給 value(**表示二級指標,指向指標變數的指標變數),注意因為是C都是值傳遞,所以

1. value變數複製了a這個指標變數的地址(不是a的內容);

2. *value表示a的內容(即a中儲存的地址);

3. **value表示a儲存的地址所指向的內容。

理清楚以上三點基本上就能很好理解這篇文章說的東西了。

這樣就達到了修改a的內容,以及a所指向的內容兩個目標了。

相關推薦

辨析地址傳遞傳遞

作者想通過如下程式碼來為變數a申請記憶體,並將其指向的值改為5. #include <stdio.h> void foo(int * value) { value=(int *)malloc(4); *value = 5; } int main(

C語言地址傳遞傳遞

  1、在C語言中,所有非陣列形式的資料實參都是以值傳遞的形式呼叫,在值傳遞的過程中,被呼叫函式的形式引數被視為該函式的區域性變數,即在記憶體的堆疊中開闢空間以存放由主調函式放進來的實參的值,從而成為了實參的一個拷貝。所以被呼叫函式不能修改作為實參的實際變數的值,而只能修改

關於Java 拷貝數組方法 Arrays.copyOf() 是地址傳遞還是傳遞

clone images java 地址 tput mage alt 元素 color 基本元素為對象時,淺拷貝,拷貝引用(ArrayList 的clone()調用Arrays.copyof(),官方文檔註明為淺拷貝) class A{ int

Struts2配置使用參數接收,轉發重定向,多方法,ognl使用傳遞,struts標簽使用

isp -name users .org 填充 導航 建模 尋址 XML 本文檔包括了 Struts2配置使用參數接收,轉發與重定向,多方法,ognl使用與值傳遞,struts標簽使用 (1)首先加入jar包(最小jar組合) (1) 在web.xml中註冊

Java——傳遞引用傳遞

color 16px code mar 變量 參數傳遞 形參 函數 ava 1.基本類型和引用類型在內存中的保存 (1)基本類型的變量保存原始值,即它代表的值就是數值本身;    基本類型在聲明變量時就為它分配了空間;    基本類型在參數傳遞過程中屬於值傳遞,也就是復

傳遞引用傳遞

double 字符 浮點型 ima 原來 例子 布爾 println private 基本數據類型 (屬於值傳遞) 整型:byte,short,int,long 浮點型:float,double 字符型:char 布爾型:boolean 引用數據

面試再問傳遞引用傳遞,把這篇文章砸給他!

java的值傳遞和引用傳遞在面試中一般都會都被涉及到,今天我們就來聊聊這個問題,首先我們必須認識到這個問題一般是相對函式而言的,也就是java中的方法引數,那麼我們先來回顧一下在程式設計語言中有關引數傳遞給方法(或函式)的兩個專業術語: 按值呼叫(call by value)

ethereum(以太坊)(四)--傳遞引用傳遞

pragma solidity ^0.4.0; // priveta public internal contract Test{ uint public _age; function Test(uint age){ _age = age; }

java 引用傳遞(call by reference)傳遞(call by value)

引用資料型別是引用傳遞(call by reference),基本資料型別是值傳遞(call by value) (1)值傳遞不可以改變原變數的內容和地址---》函式呼叫時是把實參的值傳給形參,函式呼叫結束後形參的值不能帶回給實參。 (2)引用傳遞不可以改變原變數的地址,但可以

javascript傳遞引用傳遞

javascript中,變數型別分為基本型別和物件型別,基本型別有以下幾種:string,number,boolean,null,undefined,物件型別就是object,object又分為object,array,function。基本型別是值傳遞,物件型別是引用傳遞。具體來說,就是基本型

java的引數傳遞傳遞還是地址傳遞

java的引數傳遞是值傳遞還是地址傳遞結論: 1、基本型別作為引數傳遞時,是傳遞值的拷貝,無論你怎麼改變這個拷貝,原值是不會改變的 2、物件作為引數傳遞時,是把物件在記憶體中的地址拷貝了一份傳給了引數。 基本型別作為引數傳遞 public class Test1

JAVA引數傳遞方式 (按傳遞引用傳遞區別)

首先要明確的是JAVA中沒有引用傳遞, 全部是按值呼叫 令大家所費解的 當物件引用作為引數時  函式為什麼能修改真實的物件呢?這不是引用傳遞的特徵嗎? 尤其先學習C++再學習JAVA的同學(比如說我自己)會這樣認為, 用白話解釋就是: 引用傳遞指標時, 連函式操作的指

C# 二十四、傳遞引用傳遞

值傳遞 使用值傳遞時,向形式引數傳遞的是實在引數的副本,方法內發生的對形式引數的更改對實在引數本身沒有任何影響。 程式碼示例: static void Main(string[] args) { int i =

C#中傳遞引用傳遞的區別

以值傳遞引數 當實參當作值來傳遞時,就產生了一個新的拷貝。 class Test { static void Main(string[] args) { int x=8; Fo(x);

java基礎–(11)–關於Java中的傳遞“引用傳遞

結論:Java中都是值傳遞,沒有“引用傳遞” (1)基本資料型別傳值,對形參的修改不會影響實參; (2)引用型別傳引用的值,形參和實參指向同一個記憶體地址(同一個物件),所以對引數的修改會影響到實際的物件; (3)String, Integer, Double等immutable的型別特殊處

Java中傳遞引用傳遞

//Test.java public class Test { public static void main(String[] args) { Person ps =

函式引數函式呼叫(徹底理解傳遞引用傳遞)

函式呼叫的作用: ·用實引數向形式引數傳遞資料; ·為獲得資料引數及在函式體中宣告的變數分配儲存空間; ·中斷現行(呼叫)函式,把流程向被呼叫函式的入口處,開始執行被調函式。當引數表為空時,表示該函式不從呼叫函式接受資料。 函式引數傳遞機制   堆疊儲存區是主調函式(過程)

Java語言中的方法引數——傳遞引用傳遞

Java語言中的方法引數有兩種: 1、基本資料型別(數字、布林值) 2、物件引用 基於方法引數的傳遞有兩種方式:值傳遞和引用傳遞。 值傳遞表示方法接收的是呼叫者提供的值。 引用傳遞表示方法接收的是呼叫者提供的變數地址。 Java程式設計語言總是採用按值傳遞的方式,也就是說

關於Java 拷貝陣列方法 Arrays.copyOf() 是地址傳遞還是傳遞

在看別人的關於 CopyOnWriteArrayList 這個類的時候,看到有人提出了關於:陣列拷貝的方法Arrays.copyOf() 的問題,如下: 只是複製了引用地址,陣列內的物件還是和舊陣列一樣的? 看了他的問題,我也是有點迷惑了,以前都沒想過這個。既然如此,我就有如

java中的傳遞引用傳遞(隨筆)

       這裡複習一下Java的值傳遞與引用傳遞。        值傳遞(形式引數型別是基本資料型別):方法呼叫時,實際引數把它的值傳遞給對應的形式引數,形式引數只是用實際引數的值初始化自己的儲存單元內容,是