最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中傳值與傳指針的介紹與區(qū)別

 更新時間:2019年06月23日 09:57:59   作者:守望  
這篇文章主要給大家介紹了關于C語言中傳值與傳指針的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C語言具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

我們可能聽過C語言中的傳值和傳指針,在其他語言中,也有傳引用一說,那么他們到底有什么區(qū)別呢?如果你還不能準確地分辨,就該好好了解一下了。

傳值

我們在初學C語言的時候就被老師教過,下面的方式是無法交換a和b的值的:

#include<stdio.h>
void swap(int a,int b)
{
 int temp = a;
 a = b;
 b = temp;
 printf("swap a = %d,b = %d\n",a,b);
}
int main(void)
{
 int a = 10;
 int b = 20;
 printf("before swap:a = %d,b = %d\n",a,b);
 swap(a,b);
 printf("after swap:a = %d,b = %d\n",a,b);
 return 0;
}

運行結果如下:

before swap:a = 10,b = 20                                                                                                                                                                  
internal swap a = 20,b = 10                                                                                                                                                                
after  swap:a = 10,b = 20

可以看到,a和b的值最終并沒有被交換。開始時a,b的值為10,20,而最終還是同樣的值。

為什么呢?因為函數(shù)參數(shù)在傳遞的時候,都是傳原數(shù)據(jù)的副本,也就是說,swap內部使用的a和b只是最初始a和b的一個副本而已,所以無論在swap函數(shù)內部對a和b做任何改變,都不會影響初始的a和b的值。

正因如此,我們常常被告知,不要把直接把結構體直接作為參數(shù),這樣效率會很低。由于結構體本身占用字節(jié)數(shù)較大,如果直接作為參數(shù),那么將會產(chǎn)生一個較大的”副本“,如此一來,效率也就很低了。

我們再結合下面的圖來理解:

首先圖中方框中的上部分a和b代表了main函數(shù)中的a和b,即原始數(shù)據(jù),而方框中的下部分a和b代表了函數(shù)的參數(shù)a和b,即原始數(shù)據(jù)的“副本”。(后面的圖都是如此,上部分代表原始值,下部分代表函數(shù)參數(shù)值)。

調用swap函數(shù)前后的情形如下:

由于在swap中永遠只是對a和b的副本進行操作,因此完全不影響原始的a和b的值。最終也不可能達到交換a和b的值的目的。

傳指針

那么為解決上面的問題,我們知道,需要傳指針。其代碼如下:

#include<stdio.h>
void swap(int *a,int *b)
{
 int temp = *a;
 *a = *b;
 *b = temp;
 printf("swap a = %d,b = %d\n",*a,*b);
}
int main(void)
{
 int a = 10;
 int b = 20;
 printf("before swap:a = %d,b = %d\n",a,b);
 swap(&a,&b);
 printf("after swap:a = %d,b = %d\n",a,b);
 return 0;
}

運行結果:

before swap:a = 10,b = 20                                                                                                                                                                  
swap a = 20,b = 10                                                                                                                                                                         
after  swap:a = 20,b = 10

可以看到在這種情況下,a,b的值才是真正交換了。

為什么又有傳值,又有傳指針

看到這里,不知道你是否會疑惑,為什么給函數(shù)傳遞參數(shù)的時候,一會是傳值,一會是傳指針呢?為什么傳指針就能改變參數(shù)的值呢?實際上,C語言里,參數(shù)傳遞都是值傳遞!也就是說,你認為的傳指針也是傳值,只不過它的值是指針類型罷了。

我們再通過圖來理解前面為什么傳指針就可以交換a,b的值:

從圖中可以看出,雖然傳遞給函數(shù)的是指向a和b的指針的副本,但是它的副本同樣也是指向a和b,因此雖然不能改變指針的指向,但是能改變參數(shù)a和b指向的內容,即改變原始a和b的值。

再看傳指針

如果是為指針p申請一段內存,下面的代碼能達到目的嗎?

#include<stdio.h>
#include<stdlib.h>
void getMemery(int *p)
{
 /*申請1024個int大小*/
 p = malloc(sizeof(int)*1024);
 if(NULL == p)
 {
 printf("malloc failed\n");
 p = NULL;
 }
}
int main(void)
{
 int *p = NULL;
 getMemery(p);
 printf("address of p is %p\n",p);
 return 0;
}

通過前面的內容分析,肯定是達不到預期效果的。

 運行結果:

address of p is (nil)

這是為什么呢?我們還是利用前面所知來分析,由于傳遞給getMemory函數(shù)的參數(shù)都是一個副本,因此函數(shù)內的p也是外部p的一個副本,因此即便在函數(shù)內部,將p指向了一塊新申請的內存,仍然不會改變外面p的值,即p還是指向NULL。

如何修改呢?我們需要傳入p的地址,即指向int類型指針的指針。

#include<stdio.h>
#include<stdlib.h>
void getMemery(int **p)
{
 /*申請1024個int大小*/
 *p = malloc(sizeof(int)*1024);
 if(NULL == *p)
 {
 printf("malloc failed\n");
 *p = NULL;
 }
}
int main(void)
{
 int *p = NULL;
 getMemery(&p);
 printf("address of p is %p\n",p);
 free(p);
 p = NULL;
 return 0;
}

運行結果如下:

address of p is 0x144f010

從運行結果可以看到,p的值被改變了。

可配合下面的圖進行理解:

總結

本文總結如下:

  • 函數(shù)的形參都是原數(shù)據(jù)的“副本”,因此在函數(shù)內無法改變原數(shù)據(jù)
  • 函數(shù)中參數(shù)都是傳值,傳指針本質上也是傳值
  • 如果想要改變入?yún)热?,則需要傳該入?yún)⒌牡刂罚ㄖ羔樅鸵枚际穷愃频淖饔茫ㄟ^解引用修改其指向的內容
  • 以上結論不限于C語言

思考

  • 如何實現(xiàn)不借助第三個變量,交換兩個整數(shù)的值?
  • 結合本文,理解C++/Java中所謂的傳引用

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

本文作者: 守望

本文鏈接: https://www.yanbinghu.com/2019/06/20/53981.html

版權聲明: 本文為原創(chuàng)文章,版權歸守望所有,并采用 CC BY-NC-SA 3.0 許可協(xié)議。轉載請聯(lián)系本人!

相關文章

  • 關于C語言中弱符號與弱引用的實際應用問題

    關于C語言中弱符號與弱引用的實際應用問題

    在編碼過程中,我們經(jīng)常遇到符號重定義的錯誤問題,本文通過實例代碼展示給大家介紹了C語言弱符號與弱引用的實際應用問題,一起看看吧
    2021-09-09
  • C語言實現(xiàn)快速排序改進版

    C語言實現(xiàn)快速排序改進版

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)快速排序的改進代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • C語言自研定時器計劃任務語法詳解

    C語言自研定時器計劃任務語法詳解

    市面主流定時器計劃任務語法: cron ,但是使用起來非常難受,設計的比較非人性話語法,我想一般人都沒幾個記住的,所以本文將自研定時器計劃任務語法,需要的可以參考一下
    2022-09-09
  • C語言中強制類型轉換的常見方法

    C語言中強制類型轉換的常見方法

    強制類型轉換是一種將一個數(shù)據(jù)類型轉換為另一個數(shù)據(jù)類型的方法,這篇文章主要為大家整理了C語言中強制類型轉換的方法,需要的可以參考一下
    2023-05-05
  • C++采用openfilename打開文件對話框用法實例

    C++采用openfilename打開文件對話框用法實例

    這篇文章主要介紹了C++采用openfilename打開文件對話框用法實例,是C++文件操作中非常實用的技巧,需要的朋友可以參考下
    2014-10-10
  • C中的volatile使用方法

    C中的volatile使用方法

    volatile 影響編譯器編譯的結果,指出,volatile 變量是隨時可能發(fā)生變化的,與volatile變量有關的運算,不要進行編譯優(yōu)化,以免出錯
    2013-02-02
  • 淺析C++中strlen函數(shù)的使用與模擬實現(xiàn)strlen的方法

    淺析C++中strlen函數(shù)的使用與模擬實現(xiàn)strlen的方法

    這篇文章主要介紹了strlen函數(shù)的使用與模擬實現(xiàn)strlen的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • C++中std::string::npos的用法

    C++中std::string::npos的用法

    這篇文章主要介紹了C++中std::string::npos的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言實現(xiàn)將字符串轉換成整數(shù)

    C語言實現(xiàn)將字符串轉換成整數(shù)

    這篇文章主要為大家詳細介紹了如何用C語言寫一個函數(shù),把字符串轉換成整數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • C語言中函數(shù)棧幀的創(chuàng)建和銷毀的深層分析

    C語言中函數(shù)棧幀的創(chuàng)建和銷毀的深層分析

    在C語言中,每一個正在運行的函數(shù)都有一個棧幀與其對應,棧幀中存儲的是該函數(shù)的返回地址和局部變量。從邏輯上講,棧幀就是一個函數(shù)執(zhí)行的環(huán)境:函數(shù)參數(shù)、函數(shù)的局部變量、函數(shù)執(zhí)行完后返回到哪里等等
    2022-04-04

最新評論

江口县| 怀化市| 鹿邑县| 葵青区| 文安县| 巴彦县| 荥阳市| 广汉市| 西乌珠穆沁旗| 东海县| 广德县| 洞头县| 金华市| 祁东县| 聊城市| 富裕县| 阿克陶县| 哈巴河县| 色达县| 凤山县| 高唐县| 怀仁县| 咸阳市| 合川市| 同江市| 航空| 平南县| 庐江县| 皮山县| 美姑县| 武平县| 阳城县| 永顺县| 房产| 社旗县| 开原市| 宾阳县| 深州市| 平原县| 淳化县| 准格尔旗|