国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    瀏覽量

    22008
  • 面試題
    +關注

    關注

    1

    文章

    12

    瀏覽量

    8170
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    C語言嵌入式系統編程注意事項-內存操作

    C語言嵌入式系統編程注意事項之內存操作 在嵌入式系統的編程中,常常要求在特定的內存單元讀寫內容,匯編有對應的MOV指令,而除C/C++以外的
    發表于 01-04 07:31

    C語言回調函數原來這么簡單

    ” 這個概念,它是回調函數能夠實現的重要基礎。 1、函數指針學習過C語言的伙伴都知道,C語言中的
    發表于 12-30 06:45

    C語言中實現函數宏的三種方式

    (0) 不同的是,({}) 不能提前退出函數宏與支持返回值。({}) 畢竟不是 while 循環,不能直接使用 break退出函數宏是比較容易理解。那支持返回值是什么意思呢? 答案是 C
    發表于 12-29 07:34

    如何用好 C 語言函數的返回值?

    基本上,沒有人會將大段的C語言代碼全部塞入 main() 函數。更好的做法是按照復用率高、耦合性低的原則,盡可能的將代碼拆分不同的功能模塊,并封裝成函數
    發表于 12-25 07:17

    C語言C++的區別及聯系

    創建源文件時什么都不給,默認是.cpp。 3、返回值 C語言中,如果一個函數沒有指定返回值類型,默認返回int類型;C++中,如果一個函數
    發表于 12-24 07:23

    C語言C++之間的區別是什么

    區別 1、面向對象編程 (OOP): C語言是一種面向過程的語言,它強調的是通過函數將任務分解為一系列步驟進行執行。 C++在
    發表于 12-11 06:23

    C語言的常量介紹

    在程序執行過程中,值不發生改變的量稱為常量。 mtianyan: C語言的常量可以分為直接常量和符號常量。 直接常量也稱為字面量,是可以直接拿來使用,無需說明的量,比如: 整型常
    發表于 11-24 07:12

    C語言的printf基本用法介紹

    也是代碼的一部分,但是它并不會給程序帶來任何影響,編譯器在編譯階段會忽略注釋的內容,或者說刪除注釋的內容。我在《C語言標識符、關鍵字和注釋》一節中做了詳細講解。 3) money 的
    發表于 11-12 07:04

    變形監測包含哪些內容?變形監測的重要性

    變形監測包含哪些內容?變形監測的核心在于持續獲取工程結構關鍵部位在空間位置(位移、沉降、傾斜)和內部狀態(應變、裂縫)上的變化信息。下面就讓南京峟思給大家具體的介紹變形監測的相關
    的頭像 發表于 08-27 11:27 ?626次閱讀
    <b class='flag-5'>變形</b>監測包含哪些<b class='flag-5'>內容</b>?<b class='flag-5'>變形</b>監測的重要性

    詳解hal_entry入口函數

    當使用RTOS時,程序從main函數開始進行線程調度;當沒有使用RTOS時,C語言程序的入口函數main函數調用了hal_entry
    的頭像 發表于 07-25 15:34 ?1978次閱讀

    C語言中的內聯函數與宏

    C編程中,內聯函數和宏都用于避免函數調用的開銷并編寫可復用的邏輯部分,但它們在工作方式和安全性方面存在顯著差異。
    的頭像 發表于 07-25 15:10 ?1904次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的內聯<b class='flag-5'>函數</b>與宏

    深入理解C語言函數—編程中的“積木塊”藝術

    在編程的世界里,函數就像建筑中的“積木塊”——它們是構建復雜程序的基石。通過靈活組合這些模塊,開發者能打造出功能強大且結構清晰的代碼。函數之所以成為C語言的核心,正是因為它解決了編程中
    的頭像 發表于 06-30 17:26 ?1858次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>函數</b>—編程中的“積木塊”藝術

    深入理解C語言C語言循環控制

    改變程序的執行流程,使代碼更加靈活和可控。本文將詳細介紹這些語句的作用及其應用場景,并通過示例代碼進行說明。Part.1break語句C語言中break語句有兩種
    的頭像 發表于 04-29 18:49 ?2034次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>C</b><b class='flag-5'>語言</b>循環控制

    為什么不需要給回調函數傳遞參數

    回調函數C語言里面一個重要機制。
    的頭像 發表于 04-15 10:11 ?834次閱讀

    STM32H7 0x00000000地址的內容引發hardfault怎么解決?

    函數時入異常,進入hardfault. 求助:關于stm32h7 ,0x00000000地址的內容是如何被改變的?觀察過正常情況下的值,如下。前三個地址的值是0,但異常時,前三個地
    發表于 03-07 08:15