在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認識你,還能領取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

    瀏覽量

    140548
  • 函數
    +關注

    關注

    3

    文章

    4372

    瀏覽量

    64288
  • 指針
    +關注

    關注

    1

    文章

    484

    瀏覽量

    71036
收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

    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 ?3852次閱讀

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

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

    Java之內聯函數_內聯函數的優缺點

    內聯函數就是指函數在被調用的地方直接展開,編譯器在調用時不用像一般函數那樣,參數壓棧,返回時參數出棧以及資源釋放等,這樣提高了程序執行速度。Java
    發表于 12-15 15:00 ?3393次閱讀

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

    理解函數指針函數指針數組、函數指針數組的指針
    的頭像 發表于 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 ?2337次閱讀

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

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

    講解下C語言內聯函數

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

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

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

    C語言內聯函數

    函數B很小,又被頻繁的調用,可能函數調用的切換時間比函數內代碼的執行時間還長,這樣明顯劃不來,那么我們就可以將這個函數聲明為內聯(加上 in
    的頭像 發表于 02-21 16:55 ?1249次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內聯</b><b class='flag-5'>函數</b>
    主站蜘蛛池模板: 一卡二卡三卡四卡无卡在线 | 黄色在线观看视频 | 黄色网址中文字幕 | 四虎影视国产精品 | 国产综合精品久久久久成人影 | 麦克斯奥特曼在线观看 | 成人av电影在线 | 天天爽夜夜爽天天做夜夜做 | 久久婷五月 | 中文字幕网资源站永久资源 | 精品无码三级在线观看视频 | 亚州第一视频 | 亚洲国内精品自在线影视 | 好大好紧好爽好湿润视频 | 免费的很黄很色的床小视频 | japanese日本护士xx亚洲 | 国产在线精品观看一区 | 爱情社保片鲁丝片一区 | 美女视频网站色软件免费视频 | xxx性xxx乱 | 国产精品久久久久久久久福利 | 免费观看老外特级毛片 | 影院成人区精品一区二区婷婷丽春院影视 | 激情五月婷婷在线 | 高清国产美女在线观看 | 女性私密部位扒开的视频 | 亚洲一区二区免费视频 | 亚洲日韩色图 | 天天天天添天天拍天天谢 | 久久综合成人网 | 毛片网站免费在线观看 | 日本免费网 | 中文字幕第二区 | 久久伊人男人的天堂网站 | 五月婷婷六月丁香激情 | 日本69xxxxxxxx69 | 欧美a色 | 欧美性色黄大片四虎影视 | 香蕉视频网站在线播放 | 成 人色 网 站 欧美大片在线观看 | 天天插天天狠天天透 |