1. 程式人生 > >指標的值傳遞和地址傳遞

指標的值傳遞和地址傳遞

值傳遞:

形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的(實參->形參),引數的值只能傳入,

不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。

指標傳遞:

形參為指向實參地址的指標,當對形參的指向操作時,就相當於對實參本身進行的操作

指標傳遞的實質:

指標傳遞引數本質上是值傳遞的方式,它所傳遞的是一個地址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,

即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的一個副本。值傳遞的特點是被調函式對形式引數的

任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值

(這裡是在說實參指標本身的地址值不會變)

#include <stdio.h>

void  swap(int p1,int p2)
{
	int temp;
	temp = p1;
	p1 = p2;
	p2 = temp;
}

int main()
{
	int a;
	int b;
	printf("輸入兩個數字:\n");
	scanf("%d%d",&a,&b);
	swap(a,b);
	printf("a=%d,b=%d\n",a,b);
	return 0; 
}
執行結果:

結果顯示  a和b的值沒有交換,這就是值傳遞

   值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值

   (這裡是在說實參指標本身的地址值不會變)

修改後:

#include <stdio.h>

void  swap(int *p1,int *p2)  //pi和p2改成了指標變數 
{
	int temp;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}

int main()
{
	int a;
	int b;
	printf("輸入兩個數字:\n");
	scanf("%d%d",&a,&b);
	swap(&a,&b);       //將a和b的地址傳遞給函式 
	printf("a=%d,b=%d\n",a,b);
	return 0; 
}

執行結果:
<img src="https://img-blog.csdn.net/20161104164021340" alt="" />


相關推薦

Java中的值傳遞地址傳遞

0.前言 被java中的“值傳遞”和“引用傳遞”困擾過一陣子,在實際程式碼中也犯過不少錯,記錄一下,方便檢視。 1.問題 首先看看程式碼: public class Test { public static void main(Stri

Java值傳遞地址傳遞:關於String型別集合型別作為函式引數時傳值問題的測試

這個問題,可能是太簡單了。稍微有點經驗的,估計都不會犯這個錯誤。不好意思,過了個年,幾天不寫程式碼,生疏了,也就有了下面的bug。先看程式碼,你要是一眼就看出問題了,那就請允許在下水那麼一回。 基本資

指標的值傳遞地址傳遞

值傳遞: 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的(實參->形參),引數的值只能傳入, 不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。 指標傳遞: 形參為指向實參地址的指標,

Java中的值傳遞地址傳遞(傳值、傳引用)

首先,不要糾結於 Pass By Value 和 Pass By Reference 的字面上的意義,否則很容易陷入所謂的“一切傳引用其實本質上是傳值”這種並不能解決問題無意義論戰中。 更何況,要想知道Java到底是傳值還是傳引用,起碼你要先知道傳值和傳引用的準確含義吧?可是如果你已經知道了這兩個名字的準確

傳遞地址傳遞的區別

首先了解一下jvm的內部如何儲存資料: 1.jvm中每個執行緒都對應一個執行時記憶體區-----棧。棧中存放執行緒自己用到的所有變數。 2.jvm規定棧和堆分開。棧儲存基本資料型別和物件引用。而物件儲存在堆裡。 3.物件引用中儲存的值是堆中物件的地址。 呼叫方法時,實參賦值形參, 值傳遞:(形式引數型

C++函數的三種傳遞方式為:值傳遞傳遞引用傳遞

否則 方式 指針 指向 out 數據結構 logs 形參 使用 C++函數的三種傳遞方式為:值傳遞、指針傳遞和引用傳遞 值傳遞: void fun(int x){ x += 5; //修改的只是y在棧中copy x,x只是y的一個副本,在內存中重新開辟的一塊臨時空間把y

什麼是 值傳遞地址傳遞引用傳遞 有什麼區別

什麼是值傳遞,地址傳遞和引用傳遞?它們有什麼不同?這在學校考試,找工作面試中都是常見的問題。它們之間的區別容易搞錯,長時間不用也容易忘記。最近又被問到這個問題,想想還是整理一下記下來,也方便以後參考。 首先,看以下三段程式碼。 1.  void swap1(i

C語言參數傳遞(值傳遞地址傳遞)+二級

strong 才有 color 示意圖 mage 影響 -s include expr 參數傳遞 C語言參數傳遞一般分為:值傳遞和地址傳遞 (註意:C語言中沒有引用傳遞,C++才有引用傳遞,因為很多C語言環境是用C++編譯器編譯,使得C看起來支持引用傳遞,導致很多網上很

傳遞引用傳遞

如何 nth value 引用 static st2 值傳遞 pack 修改方法 在java中如何修改方法參數的值 答案是 package myapp; import org.omg.CORBA.IntHolder; public class Test2 { pu

理解Java中的引用傳遞傳遞

包裝類 pri ble buffer 聲明 change cnblogs padding ber 關於Java傳參時是引用傳遞還是值傳遞,一直是一個討論比較多的話題,有論壇說Java中只有值傳遞,也有些地方說引用傳遞和值傳遞都存在,比較容易讓人迷惑。關於值傳遞和引用傳遞其

傳遞引用傳遞(不是引用類型的傳遞)的區別

com this static 實現 pre 對象 ffffff -c wap 值傳遞:方法調用時,實際參數把它的值傳遞給對應的形式參數,方法執行中形式參數值的改變不影響實際參數的值。引用傳遞:也稱為傳地址。方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方法中

Java 值傳遞引用傳遞

too log test img [0 st3 tle class cnblogs 引用傳遞 示例: public class Test3 { public static void change(int []a){ a

JAVA中的值傳遞引用傳遞問題

log 輸出結果 基礎知識 blue static 繼續 oid .net red   這是個老生常談的問題了,引起過無數爭論,但可以說一直沒有一個令人滿意的回答。   有人總結過: 對象是按引用傳遞的 Java 應用程序有且僅有的一種參數傳遞機制,即按值傳遞

java 引用傳遞傳遞

方式 con 並不是 一個 基本類型 依賴 tro 結束 事務 1.為什麽要分值傳遞和引用傳遞:   基本類型存在在棧中,復合類型(對象)存在堆中。操作棧的速度要快於堆,且對象的復制相比基本類型不僅浪費內存而且速度比較慢。 從這裏就可以看出來:對象是按照引用傳遞(數據庫事務

JavaScript值傳遞引用傳遞

類型 遞歸 boolean 簡單 java 另一個 obj 簡單的 兩個 1?數據類型:boolean,null,undefined,String,Number,指向包含的數據,進行“值傳遞”; 2、非數據類型:Array,Function,Obj

15. 值傳遞引用傳遞

args tel write oat 函數 fun sub 參數 name 一、值傳遞和引用傳遞    1、什麽是值傳遞?   答:值傳遞是指在調用函數時將實際參數(實參)復制一份傳遞到函數中,系統將為目標對象重新開辟一個完全相同的內存空間。這樣在函數中如果對參數進行修改,

java中值傳遞引用傳遞

public 例子 oar 是什麽 sta light 修改 [] 重要 1:按值傳遞是什麽 指的是在方法調用時,傳遞的參數是按值的拷貝傳遞。示例如下: [java] view plain copy public class TempTest { private

什麽是值傳遞引用傳遞

target 函數 ges alt %d item mage 什麽 修改 值傳遞 值傳遞是指在調用函數時將實際參數復制一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響到實際參數 #include<stdio.h> void fun(int nu

JS中函數參數值傳遞引用傳遞

保持 variant 全局變量 都是 tex over family nor -c 也許大家對於函數的參數都不會太在意,簡單來說,把函數外部的值復制給函數內部的參數,就和把值從一個變量復制到另一個變量一樣。深入研究,你會發現其實沒那麽簡單,這個傳參是要分倆種情況(其實這是個

java引用傳遞傳遞

pos += 基本 test 特殊 今天 對象類型 改變 ring 關於Java傳參時是引用傳遞還是值傳遞,一直是一個討論比較多的話題,有論壇說Java中只有值傳遞,也有些地方說引用傳遞和值傳遞都存在,比較容易讓人迷惑。關於值傳遞和引用傳遞其實需要分情況看待,今天學習和分析