精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言指針作為形參怎么改變其指向的地址

Q4MP_gh_c472c21 ? 來源:ERYUESANHI ? 作者:ERYUESANHI ? 2021-10-09 11:54 ? 次閱讀

就是一個函數的輸入參數是一個指針,該函數需要改變該指針指向的地址,如: 現在有一個全局數組b,現在需要編寫一個函數 輸入參數是一個指針a,需要通過該函數將該指針a指向數組b,即:

intb[3]={1,2,3};

voidfcn(參數);

voidmain()
{
int*a;
fcn(輸入參數a)

}

執行完fcn后,使參數的地址改變,這個功能怎么來實現呢?

首先說明結論:使用二級指針。

為了更好的理解這個問題,我們首先來學習一下指針最經典的例子,交換兩個數來說明函數的形參和實參之間的關系。

首先來探究以下實參和形參的關系是怎樣的。

形參為普通變量類型;

voidtest1(inta,intb)
{
printf(">>formaladdra:%d,formaladdrb:%d
",&a,&b);//打印形參地址
printf(">>formalvaluea:%d,formalvalueb:%d
",a,b);//打印形參值
}

intmain()
{
inta=1,b=2;

printf(">>actualaddra:%d,actualaddrb:%d
",&a,&b);
printf(">>actualvaluea:%d,actualvalueb:%d
",a,b);
test1(a,b);

return0;
}

下面是執行結果:

>>actualaddra:6422300,actualaddrb:6422296
>>actualvaluea:1,actualvalueb:2
>>formaladdra:6422272,formaladdrb:6422276
>>formalvaluea:1,formalvalueb:2

可以看到形參和實參的值雖然相同,但是他們的地址卻不相同,所以函數在被調用的時候傳入的參數(實參)實際上是被復制到另一個地址(形參地址)中去了,函數中對傳入參數的操作實際上是對形參地址中的數進行操作,而與實參無關。所以下面的函數不能實現交換兩個數的功能。

voidswap_1(inta,intb)
{
inttemp;
temp=a;
a=b;
b=temp;
printf(">>formaladdra:%d,formaladdrb:%d
",&a,&b);
printf(">>formalvaluea:%d,formalvalueb:%d
",a,b);
}

intmain()
{
 int a = 1, b = 2;
swap_1(a,b);
printf(">>actualaddra:%d,actualaddrb:%d
",&a,&b);
printf(">>actualvaluea:%d,actualvalueb:%d
",a,b);
return0;
}

輸出如下:

>>formaladdra:6422272,formaladdrb:6422276
>>formalvaluea:2,formalvalueb:1
>>actualaddra:6422300,actualaddrb:6422296
>>actualvaluea:1,actualvalueb:2

可以看到在swap_1函數中a,b兩個數的值是被調換了的,但是函數中的a,b的地址和主函數中a,b的地址根本不是同一個,主函數中a,b還是原來的數,所以這個函數起不到交換兩個數功能。

既然形參和實參的關系是地址不同而值相同那么我們將實參的地址當作參數傳給形參,然后在函數中對形參所指向的地址中的值(該地址就是實參的地址)進行改變是否就可以完成兩個數的交換了?

OK!下面我們來編寫函數測試以下:

voidswap_2(int*a,int*b)
{
inttemp;
printf(">>formaladdra:%d,formaladdrb:%d
",&a,&b);//打印形參地址
printf(">>formalvaluea:%d,formalvalueb:%d
",a,b);//打印形參的值
printf(">>formaladdrvaluea:%d,formaladdrvalueb:%d
",*a,*b);//打印以形參值為地址的值
temp=*a;
*a=*b;
*b=temp;
printf(">>formaladdra:%d,formaladdrb:%d
",&a,&b);
printf(">>formalvaluea:%d,formalvalueb:%d
",a,b);
printf(">>formaladdrvaluea:%d,formaladdrvalueb:%d
",*a,*b);
}

intmain()
{
inta=1,b=2;
swap_2(&a,&b);
printf(">>actualaddra:%d,actualaddrb:%d
",&a,&b);
printf(">>actualvaluea:%d,actualvalueb:%d
",a,b);
return0;
}

結果如下:

>>formaladdra:6422272,formaladdrb:6422276
>>formalvaluea:6422300,formalvalueb:6422296
>>formaladdrvaluea:1,formaladdrvalueb:2
>>formaladdra:6422272,formaladdrb:6422276
>>formalvaluea:6422300,formalvalueb:6422296
>>formaladdrvaluea:2,formaladdrvalueb:1
>>actualaddra:6422300,actualaddrb:6422296
>>actualvaluea:2,actualvalueb:1

從結果可以看出,這個函數可以交換輸入參數的值。下面我們來分析一下為什么這個函數能夠實現交換功能。

以變量a為例,首先,從結果的第一行可以看出,傳入函數的參數是地址(即實參a的地址:6420300),這個地址作為一個值存放在形參a(地址:6422272)中,然后定義一個int型變量來存放地址6422272(形參a的地址)中的值6422300(實參a的地址),然后將指向6422296(實參b的地址)地址中的值 賦給 指向6422300(實參a的地址),開始地址6422300地址中的值為2,現在該地址的值變為1,同理,在執行函數之后地址6422296中的值變為1,從而實現了兩個數的交換。

在這個過程中,是函數調用a,b兩個值的地址,并在函數中改變這兩地址中的值。與上一個函數的本質區別就是:上一個函數swap1只是將a,b的值給復制到兩個新的地址當中,并改變新的地址中的值,與a,b地址無關。而swap_2則是直接操作a,b地址中的值,進而可以實現交換兩個數的功能。

注意:實參和形參是在兩個不同地址,雖然起的名字是一樣的,當然這個名字可以自己隨意起。為了更加清楚的說明實參和形參是兩個東西,下面我將形參的變量名給改一下:

voidswap_2(int*formal_a,int*formal_b)
{
inttemp;
printf(">>formaladdra:%d,formaladdrb:%d
",&a,&b);
printf(">>formalvaluea:%d,formalvalueb:%d
",a,b);
printf(">>formaladdrvaluea:%d,formaladdrvalueb:%d
",*a,*b);
temp=*formal_a;
*formal_a=*formal_b;
*formal_b=temp;
printf(">>formaladdra:%d,formaladdrb:%d
",&a,&b);
printf(">>formalvaluea:%d,formalvalueb:%d
",a,b);
printf(">>formaladdrvaluea:%d,formaladdrvalueb:%d
",*a,*b);
}

intmain()
{
inta=1,b=2;
swap_2(&a,&b);
printf(">>actualaddra:%d,actualaddrb:%d
",&a,&b);
printf(">>actualvaluea:%d,actualvalueb:%d
",a,b);
return0;
}

結果如下:

>>formaladdra:6422272,formaladdrb:6422276
>>formalvaluea:6422300,formalvalueb:6422296
>>formaladdrvaluea:1,formaladdrvalueb:2
>>formaladdra:6422272,formaladdrb:6422276
>>formalvaluea:6422300,formalvalueb:6422296
>>formaladdrvaluea:2,formaladdrvalueb:1
>>actualaddra:6422300,actualaddrb:6422296
>>actualvaluea:2,actualvalueb:1

和之前的結果一樣,可以知道,函數在執行的時候其實是不管你名字怎么起的,而是關心地址,而你起的名字實際也只是那個地址的代號而已。

通過上面的例子已經清楚了函數的形參與實參的區別,那么現在就來解決文章開頭提出的問題

如何通過函數改變一個傳入指針作為實參的地址,其實在理解上面的關于函數的形參和實參就非常容易懂了。

首先我們來看下面一個例子

intb[3]={1,2,3};

voidfcn(int**a)
{
*a=b;
}

intmain()
{
unsignedinti=0;
int*a;

for(i=0;i<3;i++)
?????{
?????????printf(">>%d
",a[i]);
}

fcn(&a);

for(i=0;i<3;i++)
?????{
?????????printf(">>%d
",a[i]);
}
}

函數輸出為:

>>0
>>-1
>>4194304
>>1
>>2
>>3

主函數中,我們定義了一個指針a,并且沒有初始化它,之后我們是不能夠直接對它指向的地址進行賦值,因為現在它的地址是隨機的,對該地址進行操作后有可能會導致程序崩潰。我們想要用它就只能夠對它自己的值也就是它所指向的地址進行操作。函數fcn通過形參來改變輸入實參的值是怎么做到的呢?

首先看函數的形參(int **a),表示什么意思呢?就是說傳入的一個二級指針,指向指針的指針,這又是什么意思呢?比如你有一張藏寶圖,它說寶藏在a地,你到a地之后也只得到一張藏寶圖,該藏寶圖說寶藏在b地,你只有到達b地才能夠得到寶藏。這就是一個二級指針,第一個指向的地址是a,a的內容也是一個指針,指向b,b地址下才是真正的內容。

我們在主函數中定義了一個指針a,讓它傳入函數fcn,我們分析一下這個過程:

函數開辟一個形參的地址,該地址中的內容為指向傳入參數地址的值,那么函數中我們將數組b的首地址賦給該地址,也就是將實參的地址更改成了數組b的首地址。

文章確實太繞了,個人覺得最主要的點就是弄清楚指針與地址以及該地址的值的關系,還有就是形參與實參的關系。

編輯:jq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7599

    瀏覽量

    136218
  • 函數
    +關注

    關注

    3

    文章

    4307

    瀏覽量

    62433
  • 指針
    +關注

    關注

    1

    文章

    480

    瀏覽量

    70511

原文標題:C語言指針作為形參如何改變其指向的地址?

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    c語言指針

    1:指針是一個地址指向的是個類型:我們知道,c語言中的類型有int,char,bool(這個不常用),一般我們使用int,char就可以滿
    發表于 09-19 00:12

    函數指針指針函數

    ) ([列表]); 注1:“返回值類型”說明函數的返回類型,“(指針變量名 )”中的括號不能省,括號改變了運算符的優先級。若省略整體則成為一個函數說明,說明了一個返回的數據類型是
    發表于 01-22 19:28

    C語言入門教程-指向同一地址

    指向同一地址 C語言的一個優點是:任意多個指針可以指向同一內存
    發表于 07-29 11:45 ?1085次閱讀

    C語言入門教程-指向結構體的指針

    指向結構體的指針C語言中幾乎可以創建指向任何類型的指針,包括用戶自定義的類型。創建結構體
    發表于 07-29 12:04 ?3147次閱讀

    C語言入門教程-指向指針指針

    指向指針指針 創建一個指針,使它指向另一個指針,這是可能的,而且常常也是必要的。這一技術有時
    發表于 07-29 12:10 ?1090次閱讀

    C語言教程之函數指針變量與指針函數的區別(下篇)

    z=(*pfun)(x,y); //調用函數指針變量,實參x和y的值傳遞給a和b printf(“max=%dn”,z); //a
    發表于 05-22 07:30 ?1969次閱讀

    C語言初識指針

    目錄1. 指針是什么?2. 指針指針類型3.野指針3.1 野指針成因3.2 如何規避野指針4.
    發表于 12-31 19:57 ?26次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>初識<b class='flag-5'>指針</b>

    C語言指針的理解使用

    C語言指針的理解使用指針變量的聲明給普通變量的賦值對比給指針變量的賦值代*的指針的使用說明
    發表于 01-13 13:42 ?3次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>指針</b>的理解使用

    C語言中的指針(重點)超詳細

    - 指針4.3、指針的運算關系5、指針和數組6、二級指針7、指針數組1、指針是什么??在計算機
    發表于 01-13 14:10 ?11次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的<b class='flag-5'>指針</b>(重點)超詳細

    C語言-函數的可變形(不定形)

    這篇文章介紹C語言函數的不定參數、可變參數 ,實現printf一樣的傳效果。
    的頭像 發表于 08-14 09:58 ?2583次閱讀

    C語言-指針作為函數類型

    C語言函數里最常用就是指針和返回地址,特別是字符串處理中,經常需要封裝各種功能函數完成數據處理。
    的頭像 發表于 08-14 10:05 ?1827次閱讀

    指針進階第五站:函數指針

    定義一個函數指針指向的函數有兩個int并且返回一個函數指針,返回的指針
    發表于 08-17 15:58 ?519次閱讀

    C語言指針詳細解析

    可以對數據本身,也可以對存儲數據的變量地址進行操作。 指針是一個占據存儲空間的實體在這一段空間起始位置的相對距離值。在C/C++語言中,
    的頭像 發表于 11-14 16:53 ?2182次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>指針</b>詳細解析

    C語言怎樣引用指針變量

    指針C語言中的一個重要概念,也是C語言的一個重要特色。正確而靈活地運用它,可以使程序簡潔、緊湊、高校。 由于通過
    的頭像 發表于 03-10 14:43 ?1002次閱讀

    C語言數組元素的指針

    C語言調用函數時虛實結合的方法都是采用“值傳遞”方式,當用變量名作為函數參數時傳遞的是變量的值,當用數組名作為函數參數時。 由于數組名代表的是數組元素
    的頭像 發表于 03-10 14:45 ?838次閱讀