RM新时代网站-首页

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

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

3天內(nèi)不再提示

C語言-內(nèi)聯(lián)函數(shù)、遞歸函數(shù)、指針函數(shù)

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

1. 前言

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

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

2. 函數(shù)返回局部空間的地址問題

子函數(shù): 在調(diào)用結束后空間會被釋放—被系統(tǒng)回收。

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

示例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 

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

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. 內(nèi)聯(lián)函數(shù)

內(nèi)聯(lián)函數(shù): 在調(diào)用的時候不會進行壓棧出棧(不會經(jīng)歷保存地址的過程和恢復地址的過程)。

內(nèi)聯(lián)函數(shù)相當于一個替換的過程。

內(nèi)聯(lián)函數(shù)設計要注意:內(nèi)聯(lián)函數(shù)里只能寫簡單的代碼—不能寫復雜代碼。

函數(shù)里的局部變量存放在??臻g里的。棧空間:是由系統(tǒng)管理的。

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

//inline 聲明-定義內(nèi)聯(lián)函數(shù)
inline void func(void)
{
	printf("hello\n");
}

5. extern 外部引用聲明

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

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

#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. 字符串數(shù)組和字符串常量定義問題

#include 
int main()
{
	//p1指向的字符串是在程序編譯的時候賦值
	char *p1="1234567890"; //指針指向字符串常量
	//p2數(shù)組是程序運行的時候賦值
	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數(shù)組是程序運行的時候賦值
	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函數(shù)形參語法

#include 
/*
int argc :傳入的參數(shù)數(shù)量(包括可執(zhí)行文件本身)
char **p :保存?zhèn)魅氲臄?shù)據(jù)地址
main傳入的參數(shù)數(shù)據(jù)都是字符串類型。
傳參數(shù)的方式:  ./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. 指針函數(shù)與函數(shù)指針

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

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

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

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

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

函數(shù)名稱就是地址。

示例1:

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

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

示例2: 函數(shù)指針當做函數(shù)形參

#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. 遞歸函數(shù)

什么是遞歸函數(shù)? 子函數(shù)直接或者間接的方式調(diào)用自己的過程叫做遞歸。

函數(shù)自己調(diào)用自己的過程—遞歸。

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

示例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);
}

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

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

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

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

    關注

    180

    文章

    7604

    瀏覽量

    136652
  • 函數(shù)
    +關注

    關注

    3

    文章

    4327

    瀏覽量

    62562
  • 指針
    +關注

    關注

    1

    文章

    480

    瀏覽量

    70549
收藏 人收藏

    評論

    相關推薦

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

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

    C語言回調(diào)函數(shù)學習

    指針的應用是C語言編程的精髓所在,而回調(diào)函數(shù)就是C語言里面對
    發(fā)表于 05-27 09:44 ?7204次閱讀

    函數(shù)指針指針函數(shù)定義

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

    C語言指針函數(shù)函數(shù)指針詳細介紹

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

    C語言指針函數(shù)訪問

    C語言指針函數(shù)訪問
    發(fā)表于 12-16 17:23 ?1次下載

    內(nèi)聯(lián)函數(shù)詳解

    什么是內(nèi)聯(lián)性和外聯(lián)函數(shù) 類的成員函數(shù)可以分為內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù)
    發(fā)表于 11-02 14:05 ?0次下載

    c語言函數(shù)指針定義,指針函數(shù)函數(shù)指針的區(qū)別

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

    內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù)有什么區(qū)別

    內(nèi)聯(lián)函數(shù)是指用inline關鍵字修飾的函數(shù)。在類內(nèi)定義的函數(shù)被默認成內(nèi)聯(lián)函數(shù)
    發(fā)表于 12-15 11:52 ?5860次閱讀
    <b class='flag-5'>內(nèi)聯(lián)</b><b class='flag-5'>函數(shù)</b>和外聯(lián)<b class='flag-5'>函數(shù)</b>有什么區(qū)別

    Java之內(nèi)聯(lián)函數(shù)_內(nèi)聯(lián)函數(shù)的優(yōu)缺點

    內(nèi)聯(lián)函數(shù)就是指函數(shù)在被調(diào)用的地方直接展開,編譯器在調(diào)用時不用像一般函數(shù)那樣,參數(shù)壓棧,返回時參數(shù)出棧以及資源釋放等,這樣提高了程序執(zhí)行速度。Java
    發(fā)表于 12-15 15:00 ?3269次閱讀

    理解函數(shù)指針函數(shù)指針數(shù)組、函數(shù)指針數(shù)組的指針

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

    C++基礎語法之inline 內(nèi)聯(lián)函數(shù)

    上節(jié)我們分析了C++基礎語法的const,static以及 this 指針,那么這節(jié)內(nèi)容我們來看一下 inline 內(nèi)聯(lián)函數(shù)吧! inline 內(nèi)聯(lián)
    的頭像 發(fā)表于 09-09 09:38 ?2141次閱讀

    C++語法中的inline內(nèi)聯(lián)函數(shù)詳解

    上節(jié)我們分析了C++基礎語法的const,static以及 this 指針,那么這節(jié)內(nèi)容我們來看一下 inline 內(nèi)聯(lián)函數(shù)吧! inline 內(nèi)聯(lián)
    的頭像 發(fā)表于 09-09 09:33 ?3359次閱讀

    講解下C語言內(nèi)聯(lián)函數(shù)

    內(nèi)聯(lián)函數(shù)C語言C++中借鑒過來的,適當?shù)氖褂?b class='flag-5'>內(nèi)聯(lián)函數(shù)
    的頭像 發(fā)表于 02-16 09:15 ?1488次閱讀

    C語言內(nèi)聯(lián)函數(shù),提升C技巧必備

    內(nèi)聯(lián)函數(shù)C語言C++中借鑒過來的,適當?shù)氖褂?b class='flag-5'>內(nèi)聯(lián)函數(shù)
    的頭像 發(fā)表于 02-16 09:16 ?776次閱讀

    C語言內(nèi)聯(lián)函數(shù)

    函數(shù)B很小,又被頻繁的調(diào)用,可能函數(shù)調(diào)用的切換時間比函數(shù)內(nèi)代碼的執(zhí)行時間還長,這樣明顯劃不來,那么我們就可以將這個函數(shù)聲明為內(nèi)聯(lián)(加上 in
    的頭像 發(fā)表于 02-21 16:55 ?950次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內(nèi)聯(lián)</b><b class='flag-5'>函數(shù)</b>
    RM新时代网站-首页