欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析C/C++值傳遞和址傳遞的區(qū)別

 更新時(shí)間:2021年10月27日 11:51:18   作者:Z小旋  
今天通過(guò)本文給大家介紹C/C++值傳遞和址傳遞的區(qū)別講解,本文通過(guò)實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧

C/C++的按值傳遞和按地址傳遞有明顯不同,下面對(duì)他們作個(gè)區(qū)別:

按值傳遞:在調(diào)用函數(shù)中將原函數(shù)的值拷貝一份過(guò)去被調(diào)用的函數(shù),在被調(diào)用函數(shù)中對(duì)該值的修改不會(huì)影響原函數(shù)的值。

按地址傳遞:在調(diào)用函數(shù)的時(shí)候?qū)⒃瘮?shù)的值所在的地址拷貝一份過(guò)去,被調(diào)用函數(shù)對(duì)這個(gè)地址所作的修改會(huì)影響原來(lái)的值。

概述:

首先我們要知道 a的地址”和“a地址中的內(nèi)容”的區(qū)別,數(shù)據(jù)是存放在內(nèi)存中的,每一個(gè)變量都有一個(gè)內(nèi)存地址, 變量的內(nèi)容存放在對(duì)應(yīng)內(nèi)存地址的空間中

比方說(shuō)定義

int a = 10;

那么a在內(nèi)存中的地址是0x1100,在這個(gè)地址中存儲(chǔ)的數(shù)據(jù)是10

在這里插入圖片描述

假設(shè)創(chuàng)建指針p,把a(bǔ)的地址賦值給p,就是把a(bǔ)的首地址0x1100賦值給指針p,這個(gè)時(shí)候p的值就是變量a在內(nèi)存中的首地址

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

在這里插入圖片描述

簡(jiǎn)單點(diǎn)的理解就好比你去圖書館借書,每本書都會(huì)有他的一個(gè)編號(hào)(地址),記錄它所在的位置,而這個(gè)書,就是這個(gè)地址對(duì)應(yīng)的內(nèi)容,
如果你用指針,得到的是這個(gè)書所對(duì)應(yīng)的編號(hào)(地址) ,存儲(chǔ)內(nèi)容就是地址
如果你是變量賦值,值傳遞,那么就相當(dāng)于復(fù)印了一遍這個(gè)書(地址對(duì)應(yīng)的內(nèi)容),然后用一個(gè)新的編號(hào)(地址),去存儲(chǔ)你復(fù)印的這本書

在這里插入圖片描述

從命名來(lái)理解

所以我們就會(huì)發(fā)現(xiàn):

值傳遞,或者變量賦值,修改變量的值,修改的是新的新的編號(hào)(地址)中的內(nèi)容(復(fù)印的書),不會(huì)影響到原來(lái)編號(hào)(地址)中的數(shù)據(jù)。

也就是形參是實(shí)參內(nèi)容的拷貝,并不是地址的拷貝,所以改變形參的值并不會(huì)影響實(shí)參的值

在這里插入圖片描述

使用址傳遞,用指針修改變量的值,就是把原編號(hào)(地址)中的書給修改了,換了一本新的書,就相當(dāng)于對(duì)實(shí)參本身進(jìn)行的操作。

聲明Declaration:描述在其他地方創(chuàng)建的對(duì)象,并不分配內(nèi)存。(可以出現(xiàn)在多個(gè)地方)

定義Definition:產(chǎn)生一個(gè)新的對(duì)象,并分配內(nèi)存。(只能出現(xiàn)一次)

值傳遞

新開辟一個(gè)內(nèi)存空間,存儲(chǔ)原來(lái)變量的值,修改變量修改的是新的內(nèi)存空間中的值。所以,原始的參數(shù)不會(huì)被函數(shù)修改。

值傳遞的優(yōu)點(diǎn): 通過(guò)值來(lái)傳遞的參數(shù)可以是數(shù)字,變量,表達(dá)式。原本參數(shù)的值不會(huì)被修改。

值傳遞的缺點(diǎn): 不能修改原參數(shù)的值。

#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;
}

輸出:

在這里插入圖片描述

址傳遞

址傳遞就是指針傳遞,形參實(shí)際是指向?qū)崊⒌刂返闹羔?,?dāng)對(duì)形參的進(jìn)行操作時(shí),就相當(dāng)于對(duì)實(shí)參本身進(jìn)行的操作,可以改變指針指向內(nèi)容的值,但是不能改變指針本身的地址。

#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;
}

**加粗樣式**

在你了解了什么是值傳遞和址傳遞之后,我們來(lái)看一個(gè)面試題:

#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;
}

請(qǐng)問(wèn)運(yùn)行會(huì)有什么樣的結(jié)果? 會(huì)輸出hello world嗎?

答:程序崩潰,沒(méi)有輸出

因?yàn)?GetMemory 并不能傳遞動(dòng)態(tài)內(nèi)存,Test 函數(shù)中的 str 一直都是 NULL。strcpy(str, “hello world”);將使程序崩潰
函數(shù)中的p其實(shí)是實(shí)參str的一份拷貝,函數(shù)中的操作都是對(duì)q進(jìn)行的,str仍然是NULL,所以輸出*str的值產(chǎn)生崩潰

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

在這里插入圖片描述

這一點(diǎn)需要注意

解決的話可以把形參改為二重指針,程序便可以按預(yù)想中的情形進(jìn)行:

二重指針指向一重指針的地址 也就是傳遞過(guò)來(lái)的實(shí)際是*str的參數(shù)本身

#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;
}

到此這篇關(guān)于解析C/C++值傳遞和址傳遞的區(qū)別的文章就介紹到這了,更多相關(guān)C/C++值傳遞和址傳遞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)電腦關(guān)機(jī)程序

    C語(yǔ)言實(shí)現(xiàn)電腦關(guān)機(jī)程序

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電腦關(guān)機(jī)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • return和break的區(qū)別解析

    return和break的區(qū)別解析

    這篇文章主要介紹了return和break的區(qū)別解析,需要的朋友可以參考下
    2014-02-02
  • C++開源庫(kù)nlohmann/json的介紹和使用詳解

    C++開源庫(kù)nlohmann/json的介紹和使用詳解

    nlohmann/json?是一個(gè)C++實(shí)現(xiàn)的JSON解析器,使用非常方便直觀,這篇文章主要為大家詳細(xì)介紹了nlohmann/json的簡(jiǎn)介和使用,需要的可以參考下
    2023-12-12
  • C++四種cast使用詳細(xì)介紹

    C++四種cast使用詳細(xì)介紹

    本文主要介紹了C++四種cast使用詳細(xì)介紹,今天我們要來(lái)講的是顯式類型轉(zhuǎn)換,C++提供了四種顯式類型轉(zhuǎn)換,分別是:static_cast、dynamic_cast、const_cast、reinterpret_cast,感興趣的可以了解一下
    2022-07-07
  • C++ Boost Thread線程使用示例詳解

    C++ Boost Thread線程使用示例詳解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • C語(yǔ)言 if else 語(yǔ)句詳細(xì)講解

    C語(yǔ)言 if else 語(yǔ)句詳細(xì)講解

    本文主要介紹C語(yǔ)言中的if else,這里詳細(xì)介紹了if else 語(yǔ)句并提供了簡(jiǎn)單的示例代碼,希望能幫助編程入門的小伙伴學(xué)習(xí)
    2016-07-07
  • C語(yǔ)言開發(fā)中的常見錯(cuò)誤詳解

    C語(yǔ)言開發(fā)中的常見錯(cuò)誤詳解

    這個(gè)分欄是對(duì)于使用C語(yǔ)言編程過(guò)程中可能會(huì)出現(xiàn)的一些錯(cuò)誤而進(jìn)行的說(shuō)明,更多的錯(cuò)誤示例將會(huì)在后面的內(nèi)容里進(jìn)行演示。希望這個(gè)分欄的內(nèi)容可以幫助剛學(xué)編程的小白少走一些彎路,以及吸取更多的編碼經(jīng)驗(yàn)
    2022-05-05
  • 關(guān)于VS2019 C++項(xiàng)目同時(shí)出現(xiàn)LNK2005 和LNK1169 error 的解決辦法

    關(guān)于VS2019 C++項(xiàng)目同時(shí)出現(xiàn)LNK2005 和LNK1169 error 的解決辦法

    這篇文章主要介紹了關(guān)于VS2019 C++項(xiàng)目同時(shí)出現(xiàn)LNK2005 和LNK1169 error 的解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • C程序讀取鍵盤碼的方法

    C程序讀取鍵盤碼的方法

    這篇文章主要介紹了C程序讀取鍵盤碼的方法,運(yùn)行時(shí)可通過(guò)鍵盤按鍵獲取其對(duì)應(yīng)的鍵盤碼,文章最后附帶了鍵盤碼與按鍵的對(duì)照表,需要的朋友可以參考下
    2014-09-09
  • C++排序算法之插入排序

    C++排序算法之插入排序

    這篇文章主要為大家詳細(xì)介紹了C++排序算法之插入排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08

最新評(píng)論