中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C/C++值傳遞和址傳遞有什么區別

發布時間:2021-10-27 13:40:06 來源:億速云 閱讀:118 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“C/C++值傳遞和址傳遞有什么區別”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“C/C++值傳遞和址傳遞有什么區別”這篇文章吧。

C/C++的按值傳遞和按地址傳遞有明顯不同,下面對他們作個區別:

按值傳遞:在調用函數中將原函數的值拷貝一份過去被調用的函數,在被調用函數中對該值的修改不會影響原函數的值。

按地址傳遞:在調用函數的時候將原函數的值所在的地址拷貝一份過去,被調用函數對這個地址所作的修改會影響原來的值。

概述:

首先我們要知道 a的地址”和“a地址中的內容”的區別,數據是存放在內存中的,每一個變量都有一個內存地址, 變量的內容存放在對應內存地址的空間中

比方說定義

int a = 10;

那么a在內存中的地址是0x1100,在這個地址中存儲的數據是10

C/C++值傳遞和址傳遞有什么區別

假設創建指針p,把a的地址賦值給p,就是把a的首地址0x1100賦值給指針p,這個時候p的值就是變量a在內存中的首地址

int a =10;
int*p;
p=&a; //把a的首地址賦值給P

C/C++值傳遞和址傳遞有什么區別

簡單點的理解就好比你去圖書館借書,每本書都會有他的一個編號(地址),記錄它所在的位置,而這個書,就是這個地址對應的內容
如果你用指針,得到的是這個書所對應的編號(地址) ,存儲內容就是地址
如果你是變量賦值,值傳遞,那么就相當于復印了一遍這個書(地址對應的內容),然后用一個新的編號(地址),去存儲你復印的這本書

C/C++值傳遞和址傳遞有什么區別

從命名來理解

所以我們就會發現:

值傳遞,或者變量賦值,修改變量的值,修改的是新的新的編號(地址)中的內容(復印的書),不會影響到原來編號(地址)中的數據。

也就是形參是實參內容的拷貝,并不是地址的拷貝,所以改變形參的值并不會影響實參的值

C/C++值傳遞和址傳遞有什么區別

使用址傳遞,用指針修改變量的值,就是把原編號(地址)中的書給修改了,換了一本新的書,就相當于對實參本身進行的操作。

聲明Declaration:描述在其他地方創建的對象,并不分配內存。(可以出現在多個地方)

定義Definition:產生一個新的對象,并分配內存。(只能出現一次)

值傳遞

新開辟一個內存空間,存儲原來變量的值,修改變量修改的是新的內存空間中的值。所以,原始的參數不會被函數修改。

值傳遞的優點: 通過值來傳遞的參數可以是數字,變量,表達式。原本參數的值不會被修改。

值傳遞的缺點: 不能修改原參數的值。

#include <stdio.h>
 
void swap (int x, int y)
{
	int temp;
	temp = x;
	x = y;
	y = temp;
//	printf ("x = %d, y = %d\n", x, y);
}
 
int main (void)
{
	int a = 4, b = 6;
	printf ("交換前:\n a = %d, b = %d\n", a, b);
	swap (a, b);
	printf ("交換后:\n a = %d, b = %d\n", a, b);
	return 0;
}

輸出:

C/C++值傳遞和址傳遞有什么區別

址傳遞

址傳遞就是指針傳遞,形參實際是指向實參地址的指針,當對形參的進行操作時,就相當于對實參本身進行的操作,可以改變指針指向內容的值,但是不能改變指針本身的地址。

#include <stdio.h>
void swap (int *x, int *y)
{
	int temp=*x;
	*x=*y;
	*y=temp;
	//printf("x = %d, y = %d\n", *x, *y);
}
 
int main(void)
{
	int a=4;
	int b=6;
    printf("交換前:\n a = %d, b = %d\n", a, b);
	swap (&a,&b);  //傳遞的是地址 
	printf("交換后:\n a = %d, b = %d\n", a, b);
	return 0;
}

C/C++值傳遞和址傳遞有什么區別

在你了解了什么是值傳遞和址傳遞之后,我們來看一個面試題:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void GetMemory( char *p ) {
	p = (char *) malloc( 100 );
}


int main (void) {
	char *str = NULL;
	GetMemory( str );
	strcpy( str, "hello world" );
	printf( str );
	return 0;
}

請問運行會有什么樣的結果? 會輸出hello world嗎?

答:程序崩潰,沒有輸出

因為 GetMemory 并不能傳遞動態內存,Test 函數中的 str 一直都是 NULL。strcpy(str, “hello world”);將使程序崩潰
函數中的p其實是實參str的一份拷貝,函數中的操作都是對q進行的,str仍然是NULL,所以輸出*str的值產生崩潰

也就是:傳遞給形參的指針仍然是實參指針的一份拷貝

C/C++值傳遞和址傳遞有什么區別

這一點需要注意

解決的話可以把形參改為二重指針,程序便可以按預想中的情形進行:

二重指針指向一重指針的地址 也就是傳遞過來的實際是*str的參數本身

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void GetMemory( char **p ) {
	*p = (char *) malloc( 100 );
}

int main (void) {
	

	char *str = NULL;
	GetMemory(&str);
	strcpy( str, "hello world" );
	printf( str );
	return 0;
}

以上是“C/C++值傳遞和址傳遞有什么區別”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

丘北县| 三江| 青冈县| 乐平市| 科技| 江西省| 永善县| 扎囊县| 莒南县| 江山市| 西藏| 普定县| 天台县| 黎平县| 驻马店市| 辛集市| 兖州市| 安达市| 铜梁县| 胶州市| 阿克陶县| 崇州市| 叶城县| 开鲁县| 张家港市| 北碚区| 溆浦县| 扶绥县| 当阳市| 高唐县| 吉安市| 金寨县| 汉沽区| 来凤县| 瑞昌市| 银川市| 惠来县| 镇沅| 衡阳县| 葵青区| 临沭县|