色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

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

3天內不再提示

C語言-內聯函數、遞歸函數、指針函數

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2022-08-14 10:03 ? 次閱讀

1. 前言

這篇文章介紹C語言的內聯函數、遞歸函數、函數指針、指針函數、局部地址、const關鍵字、extern關鍵字等知識點;這些知識點在實際項目開發中非常常用,非常重要。

下面就以小章節的流程介紹每個知識點。

2. 函數返回局部空間的地址問題

子函數: 在調用結束后空間會被釋放—被系統回收。

總結:子函數不能返回局部變量的地址。

示例1:

#include 
char *func(void);
int main()
{
	printf("%s\n",func());  //打印不出來。
	return 0;
}

char *func(void)
{
	char buff[]="1234567890";
	return buff;
}

示例2:

#include 
char *func(char *p);
int main()
{
	char buff[]="1234567890";
	printf("%s\n",func(buff)); //可以打印
	return 0;
}

char *func(char *p)
{
	return p;
}

示例3:

#include 
char *func(void);
int main()
{
	printf("%s\n",func());  //可以打印
	return 0;
}

char *func(void)
{
	static char buff[]="1234567890";
	return buff;
}

3. const 只讀關鍵字(常量)

(1) const關鍵字—修飾變量

#include 
int main()
{
	//const int a; //初始化不賦值,這行代碼就沒有意義
	const int a=100;
	a=200; //錯誤的代碼--無法對常量賦值--只讀變量賦值
	printf("a=%d\n",a);
	return 0;
}

(2) const關鍵字—修飾指針

#include 

//指針: 數據域、指針(地址)域

int main()
{
	int a=100;
	int b=200;
	//const常用4種修飾指針的方法
	const int *p1=&a; //指向空間值無法修改,指向的地址可以改變
	int const *p2=&a; //指向空間值無法修改,指向的地址可以改變
	int *const p3=&a; //指向空間值可以修改,指向的地址無法改變
	const int *const p4=&a;  //向空間值無法修改,指向的地址無法改變
	//int *p5 const; 語法是錯誤的
	
	//*p1=666; 錯誤的
	//p1=&b;   正確的
	//*p2=666;錯誤的
	//p2=&b;正確的
	//*p3=666;正確的
	//p3=&b;錯誤的
	//p4=&b;錯誤的
	//*p4=666;錯誤的
	return 0;
}

4. 內聯函數

內聯函數: 在調用的時候不會進行壓棧出棧(不會經歷保存地址的過程和恢復地址的過程)。

內聯函數相當于一個替換的過程。

內聯函數設計要注意:內聯函數里只能寫簡單的代碼—不能寫復雜代碼。

函數里的局部變量存放在棧空間里的。棧空間:是由系統管理的。

#include 
void func(void);
int main()
{
	int a;
	func();
	printf("12345\n");
	return 0;
}

//inline 聲明-定義內聯函數
inline void func(void)
{
	printf("hello\n");
}

5. extern 外部引用聲明

extern 多用于多文件編程里變量、函數、其他數據類型的引用聲明。

外部引用聲明的時候,不能賦值。

#include 
//引用聲明
extern int a;
extern char buff[];
extern void func();

int main()
{
	printf("%d\n",a);
	printf("%s\n",buff);
	func();
	return 0;
}

int a=100;
char buff[]="1234567890";
void func()
{
	printf("hello\n");
}

6. 字符串數組和字符串常量定義問題

#include 
int main()
{
	//p1指向的字符串是在程序編譯的時候賦值
	char *p1="1234567890"; //指針指向字符串常量
	//p2數組是程序運行的時候賦值
	char p2[]="abcdefg";
	//p1[0]='A'; 錯誤的
	printf("%s\n",p1);
	printf("%s\n",p2);
	return 0;
}

示例2:

#include 

int main()
{
	//p1指向的字符串是在程序編譯的時候賦值
	char *p1="1234567890"; //指針指向字符串常量
	//p2數組是程序運行的時候賦值
	char p2[]="abcdefg";
	int a;
	int b;
	int c;
	printf("a=%#x\n",&a);
	printf("b=%#x\n",&b);
	printf("c=%#x\n",&c);
	printf("p1=%#x\n",p1);
	printf("p2=%#x\n",p2);
	return 0;
}
/*
a=0xbf9f93e0
b=0xbf9f93dc
c=0xbf9f93d8
p1=0x8048524
p2=0xbf9f93e4
*/

7. 標準main函數形參語法

#include 
/*
int argc :傳入的參數數量(包括可執行文件本身)
char **p :保存傳入的數據地址
main傳入的參數數據都是字符串類型。
傳參數的方式:  ./a.out 123 456 789
*/
int main(int argc,char **p)
//int main(int argc,char *p[]) p[0] p[1] p[2]
{
	int i;
	for(i=0;i

8. 指針函數與函數指針

數組指針: 本身是指針,指向二維數組的指針(一維數組指針)。int (*p)[5];

指針數組: 本身是數組,數組里存放的是地址。int *p[5]; (相當于定義了5個指針)

數組的名稱本身就是數組元素的首地址—數組名稱就是地址。

**函數指針: **本身是指針,指向函數的指針。語法:int (*p)(int,int); 不支持++和—運算符。

指針函數: 本身是函數,表示函數的返回值是指針類型。語法: int *func(int a,int b){}

函數名稱就是地址。

示例1:

#include 
int func(int a,int b);
int main(int argc,char **argv)
{
	int (*p)(int,int); //指向函數的指針
	p=func;
	printf("%d\n",func(10,20)); //通過函數名稱調用函數
	printf("%d\n",p(10,20)); //通過指針調用函數--寫法1
	printf("%d\n",(*p)(10,20)); //通過指針調用函數--寫法2
	return 0;
}

int func(int a,int b)
{
	return a+b;
}

示例2: 函數指針當做函數形參

#include 
int func1(int a,int b);
int func2(int (*p)(int,int),int a,int b);

int main(int argc,char **argv)
{
	printf("%d\n",func2(func1,100,200));
	return 0;
}

int func1(int a,int b)
{
	return a+b;
}

int func2(int (*p)(int,int),int a,int b)
{
	return p(a,b);
}

9. 遞歸函數

什么是遞歸函數? 子函數直接或者間接的方式調用自己的過程叫做遞歸。

函數自己調用自己的過程—遞歸。

遞歸函數注意事項:必須有終止條件。

示例1:

#include 
int func(int a);
int main(int argc,char **argv)
{
	printf("%d\n",func(1)); //10
	return 0;
}

int func(int a)
{
	a++;
	if(a==10)
	{
		return a;
	}
	else
	{
		func(a);
	}
}

示例2:計算字符串的長度—使用遞歸

#include 
int func(char *p);
int main(int argc,char **argv)
{
	printf("%d\n",func("1234567890")); //10
	return 0;
}

//計算字符串長度
int func(char *p)
{
	if(*p=='\0')
	{
		return 0;
	}
	return 1+func(p+1);
}

/*
演示遞歸函數的返回過程:
a(); //3

int a()
{
	
	return 1+b();
}

int b()
{
	return 1+c();
}

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

    關注

    180

    文章

    7630

    瀏覽量

    140637
  • 函數
    +關注

    關注

    3

    文章

    4372

    瀏覽量

    64344
  • 指針
    +關注

    關注

    1

    文章

    484

    瀏覽量

    71051
收藏 0人收藏

    評論

    相關推薦
    熱點推薦

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

    C語言中,指針函數函數指針是強大且常用的工具。它們允許我們以更靈活的方式處理
    發表于 08-16 16:14 ?1535次閱讀

    C++教程之函數遞歸調用

    C++教程之函數遞歸調用 在執行函數 f 的過程中,又要調用 f 函數本身,稱為函數
    發表于 05-15 18:00 ?35次下載

    C語言回調函數學習

    指針的應用是C語言編程的精髓所在,而回調函數就是C語言里面對
    發表于 05-27 09:44 ?7289次閱讀

    函數指針指針函數定義

    函數指針指針函數C語言學習中最容易混淆的一些概念,好好學習吧
    發表于 01-11 16:44 ?0次下載

    C語言指針函數函數指針詳細介紹

    C語言指針函數函數指針詳細介紹。。。。。。。
    發表于 03-04 15:27 ?5次下載

    C語言指針函數訪問

    C語言指針函數訪問
    發表于 12-16 17:23 ?1次下載

    內聯函數詳解

    什么是內聯性和外聯函數 類的成員函數可以分為內聯函數和外聯函數
    發表于 11-02 14:05 ?0次下載

    c語言函數指針定義,指針函數函數指針的區別

     往往,我們一提到指針函數函數指針的時候,就有很多人弄不懂。下面就由小編詳細為大家介紹C語言
    發表于 11-16 15:18 ?3853次閱讀

    內聯函數和外聯函數有什么區別

    內聯函數是指用inline關鍵字修飾的函數。在類內定義的函數被默認成內聯函數
    發表于 12-15 11:52 ?6169次閱讀
    <b class='flag-5'>內聯</b><b class='flag-5'>函數</b>和外聯<b class='flag-5'>函數</b>有什么區別

    理解函數指針函數指針數組、函數指針數組的指針

    理解函數指針函數指針數組、函數指針數組的指針
    的頭像 發表于 06-29 15:38 ?1.5w次閱讀
    理解<b class='flag-5'>函數</b><b class='flag-5'>指針</b>、<b class='flag-5'>函數</b><b class='flag-5'>指針</b>數組、<b class='flag-5'>函數</b><b class='flag-5'>指針</b>數組的<b class='flag-5'>指針</b>

    C++基礎語法之inline 內聯函數

    上節我們分析了C++基礎語法的const,static以及 this 指針,那么這節內容我們來看一下 inline 內聯函數吧! inline 內聯
    的頭像 發表于 09-09 09:38 ?2340次閱讀

    C++語法中的inline內聯函數詳解

    上節我們分析了C++基礎語法的const,static以及 this 指針,那么這節內容我們來看一下 inline 內聯函數吧! inline 內聯
    的頭像 發表于 09-09 09:33 ?3568次閱讀

    講解下C語言內聯函數

    內聯函數C語言C++中借鑒過來的,適當的使用內聯函數
    的頭像 發表于 02-16 09:15 ?1749次閱讀

    C語言內聯函數,提升C技巧必備

    內聯函數C語言C++中借鑒過來的,適當的使用內聯函數
    的頭像 發表于 02-16 09:16 ?977次閱讀

    C語言內聯函數

    函數B很小,又被頻繁的調用,可能函數調用的切換時間比函數內代碼的執行時間還長,這樣明顯劃不來,那么我們就可以將這個函數聲明為內聯(加上 in
    的頭像 發表于 02-21 16:55 ?1255次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內聯</b><b class='flag-5'>函數</b>
    主站蜘蛛池模板: 午夜影院和视费x看 | 亚洲欧洲日产国产 最新 | 日韩欧无码一区二区三区免费不卡 | 精品国产成人AV在线看 | 亚洲精品偷拍影视在线观看 | 亚洲黄视频在线观看 | 精品视频免费在线观看 | 高H辣肉办公室 | 暖暖的高清视频在线观看免费中文 | 精品国产乱码久久久久乱码 | 旧里番YY6080在线播放 | 91精品欧美一区二区三区 | caoporn 超碰免费视频 | vagaa哇嘎黄短片 | yy4408午夜场理论片 | 美女全光末满18勿进 | 精品一区二区三区高清免费观看 | 青青草国产精品久久 | 主播蜜汁丝袜精品自拍 | 成年人视频在线免费看 | 麻豆精品无码久久久久久久久 | 亚洲毛片网 | 小SAO货边洗澡边CAO你动漫 | 入禽太深免费视频10 | 99国产福利| 国内精品久久久久影院亚洲 | 玩弄朋友娇妻呻吟交换电影 | 国产乱妇乱子在线播视频播放网站 | 无修肉动漫在线观看影片 | 超碰超碰视频在线观看 | 国产亚洲精品黑人粗大精选 | 蜜臀AV精品一区二区三区 | 久久国产精品永久网站 | 内射人妻无码色AV麻豆去百度搜 | 免费精品国产人妻国语 | 亚洲一级毛片免费在线观看 | 亚洲 欧美 国产在线视频 | 绝色娇嫩美人妻老师 | 日本吃孕妇奶水免费观看 | 三级黄色在线视频 | 伊人大香人妻在线播放 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品