C語言函數的聲明

1定義:

在C語言中,函數是一段具有特定功能的獨立代碼塊,它可以接收輸入參數、執行相關操作并返回結果。

2為什么需要函數

(1)代碼復用:避免重復編寫相同功能的代碼, (2)模塊化設計:將復雜程序分成多個小功能模塊,每個函數負責一個獨立任務,使代碼邏輯結構更加清晰。一般一個函數的代碼在50行左右 (3)好處:便于維護和調試(單個函數功能單一,出現問題容易定位和修改,不需要改動整個程序。 (4)提高開發效率:便于多人協同開發時,分工明確,編寫不同函數,最終組合成完整程序。

3、函數的聲明

(1) 基本語法

函數聲明:返回類型 函數名(形參列表);函數首部+分號就是函數聲明,只有函數聲明而沒有函數定義會編譯報錯
函數定義: 在函數聲明的基礎上添加函數體

返回類型 函數名(形參列表) { //函數體 } 只有函數定義而沒有函數聲明可能會編譯警告或出錯(函數聲明可以忽略不寫) 函數定義一般寫在源文件中 .c.cpp

(2)分析語法

1> 返回類型 i. 數組不可以做函數的返回類型(弱化為指針) i.如果函數不需要任何返回值,則返回類型寫為 void i.函數中,主要返回類型不是void,就一定需要用到return(若沒有則有隱藏bug) i.如果返回類型是void,也可以使用return,通常書寫形式為:return;只是用來結束當前函數 i.必須要確保函數全域返回。 2>函數名 i.與變量的命名規則一致(企業要求) i.>在C語言中,函數名也是函數的起始地址,函數名通過printf輸出(十六進制) i.>在C語言中,不允許出現同名函數(c++例外) 3>形參列表 1.>在函數定義或聲明時,函數首部中的函數稱為形參(臨時,調用完成后消失) i.在函數被調用時,其傳遞的參數稱為實參,實參不帶有類型 i.函數參數根據實際情況,可有可無,通常要求形參個數不超過5個。 形參和實參不僅個數和類型一一完全匹配。 多個參數之間需要通過逗號分隔 多個形參,其每個形參需要獨立的類型,不能進行合并 參數分為:入參,出參,出入參 入參:從實參到形參的單向只傳遞(從內存角度看) 出參:能將數據通過參數帶回給函數調用處 函數的參數可以是不固定個數,也可以是可變參數 實參變量名可以和形參不一樣

函數傳參的形式

值傳遞:單向值傳遞

指針傳遞

引用傳遞(C++)

(3)內存布局

棧區,堆區,全局/靜態數據區、文本區、常量區

棧區:局部變量、函數形參

特點:由編譯器自動分配和釋放。遵循"先進后出"原則

堆區:通過malloc等函數動態開辟、Free動態釋放的內存

全局/靜態數據區:存儲全局或靜態數據

文本區:主要針對代碼

常量區:主要存儲代碼

棧區,堆區、數據段(初始化數據段,未初始化數據段)、代碼段

靜態初始化變量只初始化一次,存在全局/靜態數據區

(4)參數調用過程

A.參數壓棧(保存相關數據信息

在函數調用前,先將參數從右到左的順序如棧。先進后出

比如fun(a,b,c);先入棧c,后入棧b,最后入棧a

B.保存現場

保存當前函數的寄存器

C.挑戰到被調函數

開始執行函數體

D.棧幀創建

被調函數先保存調用函數的棧基址,然后在創建自己的基地址,用于定位局部變量和參數

E.執行函數體

F.結果返回

函數中執行return時,將返回值保存在eax中。釋放局部變量的棧空間,恢復調用函數的棧基址和寄存器等。

G.恢復現場

從棧中取出返回值,跳轉回調用函數的下一條指令。

除去返回值

入棧,出棧

代碼如下

#include <stdio.h>

`int main()
{
long long num1 = 0xAAAAAAAA;
long long num2 = 0xBBBBBBBBCCCCCCCC;
long long num3 = 0xDDDDDDDD;

? ? printf("%p, %p, %p\n", num1, num2, num3);

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90334.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90334.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90334.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI人工智能名片小程序源碼系統,名片小程序+分銷商城+AI客服,包含完整搭建教程

智能名片核心功能AI人工智能名片小程序的核心功能設計旨在徹底改變傳統商務交流方式&#xff0c;為用戶提供前所未有的智能化體驗。個性化名片展示是系統的基礎功能&#xff0c;用戶可以通過豐富的模板庫和自定義設計工具&#xff0c;創建獨具特色的電子名片。系統提供多種預設…

React 教程:井字棋游戲

React 教程&#xff1a;井字棋游戲 使用 React 實現一個交互式的井字棋游戲&#xff0c;并配上好看的樣式 // 導入必要的CSS樣式和React庫 import "./App.css"; import { useState } from "react";// Square組件 - 表示棋盤上的一個格子 function Square({…

React源碼2 React中的工廠函數:createRoot()

#React V18.2 源碼前置基礎知識&#xff1a;工廠函數工廠函數是一種設計模式&#xff0c;用于動態創建對象或函數實例。其核心思想是通過封裝對象創建的細節&#xff0c;提供統一的接口&#xff0c;從而增強代碼的靈活性和可維護性&#xff0c;有一些核心作用&#xff1a;解耦創…

《UE5_C++多人TPS完整教程》學習筆記42 ——《P43 瞄準(Aiming)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P43 瞄準&#xff08;Aiming&#xff09;》 的學習筆記&#xff0c;該系列教學視頻為計算機工程師、程序員、游戲開發者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; Stephen Ulibarri…

SQL Server 臨時表、表變量與WITH語句的用法與區別

引言 在SQL Server數據處理中,臨時表、表變量和WITH語句(CTE)是關鍵的中間結果集管理工具。臨時表適合大數據量操作,表變量優化小數據量場景,而CTE則簡化復雜查詢邏輯。三者選擇需綜合考量數據量級、事務需求及代碼可讀性。本文將深入解析其工作機制,通過實測對比指導場…

【Android】組件及布局介紹

一&#xff1a;代碼分析 1&#xff1a;Android界面開發方式 &#xff08;1&#xff09;JavaView&#xff08;傳統視圖系統&#xff09; 這是 Android 早期的開發方式&#xff0c;用 Java 或 Kotlin 代碼配合 XML 布局文件 來構建界面。&#xff08;簡單了解即可&#xff09; 分…

Android 音視頻 IPC序列化工具-Flattenable

Android Binder與AIDL與Service使用案例及分析-CSDN博客 講講這個類,被用在Android音視頻中,跨進程序列化反序列化用。與Binder驅動有很強的聯系。位于: feameworks/native/utils/Flattenable.h Flattenable, 譯為令人滿意的。可能是作者十分滿意自己的這些作品吧,起了這…

文獻學習|全面繪制和建模水稻調控組景觀揭示了復雜性狀背后的調控架構。

摘要&#xff1a; 解析調控復雜性狀的機制對于推進作物改良至關重要。在此&#xff0c;我們提出了一個全面的水稻&#xff08;Oryza sativa&#xff09;調控組圖譜&#xff0c;涵蓋了來自三個代表性品種的23種不同組織的染色質可及性。我們的研究揭示了117,176個獨特的開放染色…

Linux的壓縮與解壓縮

一、使用tar命令進行打包與解包 1.0、tar命令簡介和常用選項 tar命令是Linux中經常使用的歸檔工具&#xff0c;它的主要功能是【對文件或者目錄進行打包歸檔】&#xff0c;歸檔為一個文件&#xff0c;但是并不進行壓縮&#xff1b;tar命令的歸檔操作效果如下&#xff1a; tar命…

OpenCV+OCR實現弧形文字識別

以下是基于OpenCV與OCR實現弧形文字識別的完整技術方案&#xff0c;結合了圖像預處理、幾何變換與OCR引擎調用等關鍵步驟&#xff0c;并提供優化技巧&#xff1a;&#x1f50d; 一、技術原理弧形文字識別的核心在于??將彎曲文本轉換為水平直線??&#xff0c;便于OCR引擎處理…

【保姆級目標檢測教程】Ubuntu 20.04 部署 YOLOv13 全流程(附訓練/推理代碼)

前言 YOLOv13 是 YOLO 系列的全新一代實時目標檢測框架&#xff0c;在保持極高推理速度的同時顯著提升了檢測精度&#xff0c;廣泛適用于嵌入式部署、工業質檢、智能安防等多種場景。該版本提供了 Nano、Small、Large、X-Large 四種模型規格&#xff0c;用戶可以根據計算資源和…

【大模型】到底什么是Function Calling和MCP,以及和ReAct推理的關系是什么?

文章目錄背景&#xff1a;什么是Agent&#xff1f;背景&#xff1a;為什么需要Function Calling或者MCP&#xff1f;Function Calling和MCP在用戶請求中的整體流程Function Calling&#xff08;函數/工具調用&#xff09;MCP (Model Context Protocol)ReAct (Reasoning and Act…

CANDENCE 17.4 進行元器件緩存更新

在我從立創商城導入CANDENCE元器件后&#xff0c;在ORCAD放置元器件時出現了下面的錯誤解決辦法&#xff1a;1、在左邊找到 Design Cache文件夾&#xff0c;在文件夾上鼠標右擊選擇 Cleanup Cache2、再放置該元器件&#xff0c;不管這個&#xff0c;點擊確定3、這時候成功放上…

深入理解Kafka冪等性:原理、邊界與最佳實踐

一、什么是真正的消息冪等性&#xff1f; 消息系統的冪等性經常被誤解&#xff0c;我們需要明確其精確含義和能力邊界&#xff1a; 1. 正確定義 Kafka冪等性保證的是&#xff1a;在消息傳輸過程中&#xff0c;無論因網絡重試、生產者重啟等故障導致的消息重復發送&#xff0c;B…

【RTSP從零實踐】8、多播傳輸H264碼流的RTSP服務器——最簡單的實現例子(附帶源碼)

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…

【Linux】基礎開發工具(3)

1. 版本控制器Git1.1 Git的簡史Git 的歷史可以追溯到 2005 年1。當時 Linux 內核項目的開發團隊一直使用 BitKeeper 進行版本管理&#xff0c;但由于一位 Linux 開發成員寫了一個連接 BitKeeper 倉庫的外掛&#xff0c;BitMover 公司決定中止 Linux 免費使用 BitKeeper 的授權1…

synchronized 的使用和特性

synchronized 鎖對象 普通方法 synchronized 鎖普通方法時&#xff0c;其鎖的對象是調用該方法的實例 public synchronized void method() { // 方法體 } 靜態方法 靜態方法的鎖對象是所屬的 class&#xff0c;全局只有一個。 public static synchronized void staticMetho…

Gin Web 層集成 Viper 配置文件和 Zap 日志文件指南(下)

在微服務架構中&#xff0c;Gin 常被用作 Web 層框架&#xff0c;而 Viper 用于管理配置文件&#xff0c;Zap 則提供高性能的日志記錄功能。下面將詳細介紹如何在 Gin Web 層集成 Viper 配置文件和 Zap 日志文件。 1. 項目概述 假設我們有一個基于 Go 語言的微服務項目&#…

IoTDB:專為物聯網場景設計的高性能時序數據庫

什么是IoTDB&#xff1f;IoTDB&#xff08;Internet of Things Database&#xff09;是一款開源的時序數據庫管理系統&#xff0c;專為物聯網&#xff08;IoT&#xff09;場景設計&#xff0c;由清華大學軟件學院團隊自研&#xff0c;天謀科技團隊負責維護。它針對物聯網數據的…

[netty5: MessageAggregator HttpObjectAggregator]-源碼解析

在閱讀這篇文章前&#xff0c;推薦先閱讀 [netty5: ByteToMessageCodec & MessageToByteEncoder & ByteToMessageDecoder]-源碼分析[netty5: HttpObject]-源碼解析 100-continue 100-continue 是 HTTP/1.1 協議中的一種機制&#xff0c;用于客戶端在發送大體積請求體…