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

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

3天內不再提示

C語言函數不改變形參內容的說明

聚豐開發 ? 2018-10-29 11:01 ? 次閱讀

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


這也是面試時常碰到的題,通常是把一個指針作為函數的輸入參數,在函數內部會改變輸入參數對應的指針,問面試者在函數調用過程中指針的具體內容。


這里我也設計一個這樣的函數,功能是對輸入參數指定的地址連續寫入指定個數的指定內容。問在位置(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作為函數的參數,在函數中有進行遞增操作,為什么函數返回后在位置三還是保持內容為&data_buf[0]不變?


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


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


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


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


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



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


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


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

    關注

    6

    文章

    90

    瀏覽量

    21000
  • 面試題
    +關注

    關注

    1

    文章

    9

    瀏覽量

    7926
收藏 人收藏

    評論

    相關推薦

    output函數怎么用

    output 函數是一個通用的術語,并不特指某個具體的編程語言或軟件工具。 如果你在使用 Python 編程語言,那么可能是指 print 函數。Python 中的 print
    的頭像 發表于 02-23 14:21 ?528次閱讀

    嵌入式C編碼中函數的規范

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

    c語言函數函數體用什么符號括起來

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

    c語言源程序main函數的位置

    C語言源程序中的main函數是程序的入口點,它被認為是C語言程序的起點。在執行程序時,操作系統將首先定位到main函數,并從該函數開始執行程
    的頭像 發表于 11-24 10:23 ?1022次閱讀

    c語言gets函數可以輸入數字嗎

    C語言中的gets函數是用來讀取字符串的,而不是用來讀取數字的。它會讀取輸入的字符直到遇到換行符或者文件結束符。因此,如果你嘗試使用gets函數來讀取數字,是無法準確獲取數字本身的。 首先,讓我們
    的頭像 發表于 11-24 10:00 ?796次閱讀

    c語言max函數在哪個庫

    C語言的max函數并不屬于標準C庫,它通常是由程序員自己編寫的一個宏定義。max函數用于比較兩個數的大小,返回較大的數值。 為了提供更多詳實的信息,下面將詳細介紹C語言中max
    的頭像 發表于 11-22 10:18 ?1773次閱讀

    c語言max函數的使用方法

    C語言是一門廣泛使用的編程語言,提供了許多內置的函數來執行各種任務。其中一個非常有用的函數是max函數,它用于比較兩個值并返回較大的那個值。
    的頭像 發表于 11-22 10:15 ?6458次閱讀

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

    模糊,因為并沒有具體說明函數執行失敗的原因。因此,本文將從一些實際例子入手,詳細分析和比較C語言函數返回1和返回0的優缺點,以期解決這個問題。 先來分析一下返回1的優點。首先,返回1意
    的頭像 發表于 10-31 14:43 ?545次閱讀

    怎么設計c語言的可變長參數函數?

    怎么設計c語言的可變長參數函數
    發表于 10-27 07:10

    經典C語言接口與實現:創建可重用軟件的技術

    C語言接口與實現(創建可重用軟件的技術)概念清晰、內容新穎、實例詳盡,是一本有關設計、實現和有效使用C語言
    發表于 09-25 06:42

    C語言中memmove函數的使用

    在C語言編程中,內存操作是不可或缺的一部分,而 memmove 函數是其中一個重要的工具。本文將介紹 memmove 函數的應用場景以及提供詳細的示例代碼,幫助您更好地理解如何使用這個函數
    發表于 09-13 09:17 ?775次閱讀

    C語言函數的基本知識

    函數是C語言中的基本構建塊之一,它允許我們將代碼組織成可重用、模塊化的單元。
    發表于 08-16 18:25 ?405次閱讀

    C語言中指針函數函數指針的概念及應用示例

    在C語言中,指針函數函數指針是強大且常用的工具。它們允許我們以更靈活的方式處理函數和數據,進而擴展程序的功能。
    發表于 08-16 16:14 ?360次閱讀

    C語言使用回調函數模擬委托與反射

    函數是C語言的核心概念。主調函數(caller)調用被調函數(callee)是一般的調用關系,如果被調函數(callee)參數包含
    發表于 08-03 16:12 ?361次閱讀

    C語言main函數的正確寫法

    大家好,我是嵌入式老林,從事嵌入式軟件開發多年,今天分享的內容是C語言main函數的正確寫法,希望能對你有所幫助
    發表于 07-11 11:51 ?482次閱讀
    C<b class='flag-5'>語言</b>main<b class='flag-5'>函數</b>的正確寫法
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>