1. 程式人生 > >C語言地址傳遞與值傳遞

C語言地址傳遞與值傳遞

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

  2、而在地址傳遞過程中,被調函式的形參雖然也作為區域性變數在堆疊中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的地址,被調函式對形參的任何操作都被處理成間接定址,即通過堆疊中存放的地址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。

  3、同時,還有一個問題值得大家注意:無法向函式傳遞一個數組

可以驗證一下:


void fun(char a[10])
{
	int i = sizeof(a);
	char c = a[3];
}

如果陣列真的傳遞到函式內部,那麼i的值應該是10,可惜,i的值為4,的確沒有傳遞過去。

   C語言中,當一維陣列作為函式的引數時,編譯器總是把它解析成一個指向其首元素地址的指標。

針對上面的值傳遞與地址傳遞,下面用程式碼說明問題:


/*
 * main.c
 *
 *  Created on: Apr 28, 2012
 *      Author: root
 */

#include <stdio.h>

void swap_val(int x, int y)
{
	int temp;

	temp = x;
	x = y;
	y = temp;

	printf("x = %d, y = %d\n", x, y);
}

void swap_addr(int *x, int *y)
{
	int temp;

	temp = *x;
	*x = *y;
	*y = temp;
}

int main(void)
{
	int a, b;

	printf("please input two integer\n");
	scanf("%d %d", &a,&b);
	if (a < b) {
		swap_val(a, b);
		printf("a = %d, b = %d\n", a, b);
		swap_addr(&a, &b);
		printf("a = %d, b = %d\n", a, b);
	}

	return 0;
}
 

驗證結果如下:

please input two integer
1
2
x = 2, y = 1
a = 1, b = 2
a = 2, b = 1

相關推薦

C語言地址傳遞傳遞

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

辨析地址傳遞傳遞

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

C語言參數傳遞傳遞地址傳遞)+二級指針

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

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

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

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

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

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

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

C++物件賦C#物件賦----C++C#傳遞引用傳遞淺析

在C#中,看下面一段程式: class A     {         public int value;         public A(int x)         {             value = x;         }         public

Java語言中的傳遞引用傳遞

JAVA語言中的傳遞都是值傳遞嗎?有沒有引用傳遞呢?這是一個常常被討論的問題。開始以前首先來看下面的程式碼: public class TestParameter {  // 初始值為0  protected int num = 0;  // 為方法引數重新賦值  pub

C語言常規優化策略——引數傳遞、巨集定義、全域性變數彙編

C語言常規優化策略 4 引數傳遞、巨集定義、全域性變數與彙編 按照結構化程式設計的原則,一種語言,如果具有賦值、選擇與迴圈三種結構,並嚴格按照這三種結構 來組織程式,避免使用象goto語句這類使程式控制發生跳轉的語言成分,在每一個程式塊(如選擇塊、循 環塊)中保持單向的輸入流

關於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中註冊

散分+快來報名“C語言指針匯編內存地址(二)”公開課

公開 lan shuf target dsd blank dmg userinfo gin iR歡2kaq崖居止40攘http://www.docin.com/app/user/userinfo?userid=179252984 Qsgb5V1仗mchttp://t.doc

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。基本型別是值傳遞,物件型別是引用傳遞。具體來說,就是基本型

C語言指標作為函式引數傳遞學習(一)

1. 一維指標做函式引數 傳入的指標為NULL 比如下面的例子,很多人都會理解錯: #include <stdio.h> void test(char *string) { string = "hello world"; } int main() { cha

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

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