0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言函數(shù)不改變形參內(nèi)容的說明

聚豐開發(fā) ? 2018-10-29 11:01 ? 次閱讀

注:本文是作者以前發(fā)表在其個人博客,現(xiàn)在發(fā)布到“聚豐開發(fā)”專欄


這也是面試時常碰到的題,通常是把一個指針作為函數(shù)的輸入參數(shù),在函數(shù)內(nèi)部會改變輸入?yún)?shù)對應(yīng)的指針,問面試者在函數(shù)調(diào)用過程中指針的具體內(nèi)容。


這里我也設(shè)計一個這樣的函數(shù),功能是對輸入?yún)?shù)指定的地址連續(xù)寫入指定個數(shù)的指定內(nèi)容。問在位置(1)(2)(3)指針p的值,在位置(4)(5)指針 buf的值。



答案是:


位置(1)指針p還沒賦值為空指針0
位置(2)(3)指針p的值均為&data_buf[0]
位置(4)針buf值為&data_buf[0]
位置(5)指針buf值為&data_buf[100]

void fill_buffer(unsigned char* buf,unsigned char data,unsigned char size)
{ //位置(4)
unsigned char i;
for(i=0;i {
*buf=data;
buf++;
}
}//位置(5)

void main(void)
{
unsigned char data_buf[256];
unsigned char *p;
p=(char*)data_buf; //位置(1)
fill_buffer(p,0,100); //位置(2)
while(1); //位置(3)
}


可能有的人會疑惑,明明指針p作為函數(shù)的參數(shù),在函數(shù)中有進(jìn)行遞增操作,為什么函數(shù)返回后在位置三還是保持內(nèi)容為&data_buf[0]不變?


有這種想法的人理解的邏輯流程如下,看上去也好像有道理。


void main(void)
{
unsigned char data_buf[256];
unsigned char *p;
p=(char*)data_buf;
fill_buffer(p,0,100); p在這里是輸入?yún)?shù)
//unsigned char i;
//for(i=0;i //{
// *p=data;
// p++; 執(zhí)行到這里不就是改變了p嗎?
//}
while(1); 函數(shù)返回p應(yīng)該也改變了
}


這種理解自然不對,對于函數(shù)的參數(shù),不能簡單的在函數(shù)中進(jìn)行替代理解,以這里的fill_buffer(p,0,100)為例子,函數(shù)中并不會對p進(jìn)行任何處理,而是先將p的值用一個臨時變量保存起來(也可以為寄存器),在函數(shù)中使用的是這個臨時變量。


如果用匯編來表示 fill_buffer(p,0,100)的調(diào)用過程,參考流程如下:


;lda x 為把x裝到A中
;sta x 為把A的內(nèi)容存到裝x中
;得到第一個參數(shù)
lda p
sta buf_para
;得到第二個參數(shù)
lda #0
sta data_para
;得到第三個參數(shù)
lda #100
sta size_para
;跳轉(zhuǎn)到具體函數(shù)代碼位置
jsr fill_buffer



從這個流程可以看出指針p實(shí)際上沒有被改寫,雖然p所指的位置會被函數(shù)寫入指定的內(nèi)容,函數(shù)只是從p得到一個起始地址,在函數(shù)內(nèi)部是通過另外一個指針來改寫這個地址開始位置的內(nèi)容,在調(diào)試中觀察到的寫指針是另外那個指針,并不是p。這也是C函數(shù)指針可以做輸入輸出參數(shù),而變量只能做輸入?yún)?shù)的原因。


如func(char *p,char data),函數(shù)可以讀p所指的地址內(nèi)容,也可以向p所指的地址寫入指定內(nèi)容,但data只能供函數(shù)使用,不能將函數(shù)中的值反存到data中。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言編程
    +關(guān)注

    關(guān)注

    6

    文章

    90

    瀏覽量

    21073
  • 面試題
    +關(guān)注

    關(guān)注

    1

    文章

    9

    瀏覽量

    7963
收藏 人收藏

    評論

    相關(guān)推薦

    如何給C語言中的函數(shù)定義兩個不同的名字?

    最近有位哥問我,如何給C語言中的函數(shù)定義兩個不同的名字?就是這兩個名字都是指向同一個函數(shù),同一個地址,而且兩個名字都可以當(dāng)做函數(shù)來用的那種。
    的頭像 發(fā)表于 12-19 16:21 ?641次閱讀

    嵌入式C編碼中函數(shù)的規(guī)范

    ◎ 一個函數(shù)僅完成一件功能 ◎ 重復(fù)代碼應(yīng)該盡可能提煉成函數(shù)說明:重復(fù)代碼提煉成函數(shù)可以帶來維護(hù)成本的降低。重復(fù)代碼是不良代碼最典型的特征之一。在“代碼能用就
    的頭像 發(fā)表于 12-07 14:33 ?323次閱讀

    c語言源程序的基本單位

    C語言源程序的基本單位是函數(shù)。函數(shù)是一組有關(guān)聯(lián)的語句和表達(dá)式的集合,它們一起完成特定的任務(wù)。在C語言
    的頭像 發(fā)表于 11-26 09:05 ?1849次閱讀

    嵌入式C語言的結(jié)構(gòu)特點(diǎn)

    過程中,不論是基于寄存器開發(fā)還是基于庫開發(fā),深入理解和掌握嵌入式C語言函數(shù)、指針、結(jié)構(gòu)體是學(xué)習(xí)STM32的關(guān)鍵。嵌入式C語言的結(jié)構(gòu)特點(diǎn)如下
    的頭像 發(fā)表于 11-24 16:16 ?586次閱讀
    嵌入式<b class='flag-5'>C</b><b class='flag-5'>語言</b>的結(jié)構(gòu)特點(diǎn)

    c語言函數(shù)函數(shù)體用什么符號括起來

    函數(shù) 是指將一組能完成一個功能或多個功能的語句放在一起的 代碼結(jié)構(gòu) 。 在 C語言程序 中,至少會包含一個函數(shù),及主函數(shù)main()。本文將
    的頭像 發(fā)表于 11-24 15:52 ?619次閱讀
    <b class='flag-5'>c</b><b class='flag-5'>語言</b>中<b class='flag-5'>函數(shù)</b>的<b class='flag-5'>函數(shù)</b>體用什么符號括起來

    C語言printf函數(shù)族學(xué)習(xí)筆記

    printf 應(yīng)該是學(xué)習(xí)C語言的第一個函數(shù),我們都知道它是用于字符串格式化輸出的。但是它的用法你真正了解了嗎?
    的頭像 發(fā)表于 11-24 11:15 ?835次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>printf<b class='flag-5'>函數(shù)</b>族學(xué)習(xí)筆記

    c語言源程序main函數(shù)的位置

    C語言源程序中的main函數(shù)是程序的入口點(diǎn),它被認(rèn)為是C語言程序的起點(diǎn)。在執(zhí)行程序時,操作系統(tǒng)將首先定位到main
    的頭像 發(fā)表于 11-24 10:23 ?2108次閱讀

    c語言gets函數(shù)可以輸入數(shù)字嗎

    C語言中的gets函數(shù)是用來讀取字符串的,而不是用來讀取數(shù)字的。它會讀取輸入的字符直到遇到換行符或者文件結(jié)束符。因此,如果你嘗試使用gets函數(shù)來讀取數(shù)字,是無法準(zhǔn)確獲取數(shù)字本身的。
    的頭像 發(fā)表于 11-24 10:00 ?1310次閱讀

    \0在c語言中怎么用

    C語言是一種廣泛使用的程序設(shè)計語言,具有高效、簡潔和可移植等特點(diǎn)。本文將詳盡介紹C語言的基本語法、數(shù)據(jù)類型、控制結(jié)構(gòu)、
    的頭像 發(fā)表于 11-24 09:59 ?2889次閱讀

    c語言max函數(shù)在哪個庫

    C語言的max函數(shù)并不屬于標(biāo)準(zhǔn)C庫,它通常是由程序員自己編寫的一個宏定義。max函數(shù)用于比較兩個數(shù)的大小,返回較大的數(shù)值。 為了提供更多詳實(shí)
    的頭像 發(fā)表于 11-22 10:18 ?2997次閱讀

    c語言max函數(shù)的使用方法

    C語言是一門廣泛使用的編程語言,提供了許多內(nèi)置的函數(shù)來執(zhí)行各種任務(wù)。其中一個非常有用的函數(shù)是max函數(shù)
    的頭像 發(fā)表于 11-22 10:15 ?1.2w次閱讀

    Python函數(shù)的分類

    ,b,c= 10 ,*,d,e= 20 ,**kwargs) 1、帶及不帶默認(rèn)值的位置形 實(shí)例中,在 * 號之前統(tǒng)稱為位置形,位置形可以由位置實(shí)參及關(guān)鍵字實(shí)參進(jìn)行傳值。 不帶默認(rèn)
    的頭像 發(fā)表于 11-14 11:19 ?715次閱讀

    如何綁架C語言標(biāo)準(zhǔn)庫函數(shù)?

    C語言動態(tài)內(nèi)存可以使用 malloc 標(biāo)準(zhǔn)庫函數(shù),而 C++ 會使用 new 關(guān)鍵字申請,裸機(jī)情況下一般沒有問題,但是在 RTOS 情況下,就需要考慮資源保護(hù)的情況,比如多個任務(wù)同時
    發(fā)表于 11-01 09:50 ?410次閱讀

    如何綁架C語言標(biāo)準(zhǔn)庫函數(shù)?

    C語言動態(tài)內(nèi)存可以使用 malloc 標(biāo)準(zhǔn)庫函數(shù),而 C++ 會使用 new 關(guān)鍵字申請,裸機(jī)情況下一般沒有問題,但是在 RTOS 情況下,就需要考慮資源保護(hù)的情況
    發(fā)表于 11-01 09:50 ?302次閱讀

    C語言函數(shù)返回1和返回0究竟哪個好?

    模糊,因?yàn)椴]有具體說明函數(shù)執(zhí)行失敗的原因。因此,本文將從一些實(shí)際例子入手,詳細(xì)分析和比較C語言函數(shù)返回1和返回0的優(yōu)缺點(diǎn),以期解決這個問題
    的頭像 發(fā)表于 10-31 14:43 ?878次閱讀