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;
}
*/
-
C語言
+關注
關注
180文章
7604瀏覽量
136652 -
函數(shù)
+關注
關注
3文章
4327瀏覽量
62562 -
指針
+關注
關注
1文章
480瀏覽量
70549
發(fā)布評論請先 登錄
相關推薦
評論