C语言 函数(做个笔记)
1,函數的基本情況
?類型 函數名(形參)? ? ? ? ? ? ?//函數首部
{
? ? ? ? 函數體......
}
?2,函數的定義
<類型>函數名(形參)
(1) 形參之間用逗號分割,每個形參前面的類型必須寫明
int fact(int a,int b)
{......
}
(2)可以接受0個或多個參數
3,調用函數
函數名(實參表)
(1)實參可以是常量、變量或表達式
(2)即使沒有參數,()必須有
(3)調用其他函數的函數成為主函數,如main(),被調用的函數稱為被調函數
(4)
#include <stdio.h>
double grade(int a,double b)
{.....
}int main(){grade(num_1,num_2); //grade(2,3.5); return 0;
}形參必須是變量,實參可以是常量、變量或表達式
形參和實參應一一對應,數量相同,類型一致。實參的值依次傳遞給形參
?4,函數的返回? return
(1)return 只能返回一個值
(2)函數執行過程中遇到return 停止執行,并返回一個值
(3)一個函數可以出現多個return?
用途:傳給變量賦值、再傳給函數、輸出返回值
5,無返回函數? <void>函數名()
(1)?不能使用帶值的return?
(2)可以不使用return,? ? ? ?有返回值的函數,需使用帶值的return?
(3)void不能省略,若省略。函數默認返回類型為int
6,函數的聲明
函數類型 函數名 (參數表);? ? //以分號結束
int grade(int a,int b);
(1)獲取參數類型,值返回類型,函數名
(2)參數名可以不用寫。
int grade(int,int);
7,參數的傳遞
(1)類型轉換
若形參與實參類型不同,編譯器會幫忙轉換。實參類型-->形參類型
#include <stdio.h>
void shuchu(int a);
int main(){shuchu(2.4);return 0;
} void shuchu(int a){printf("%d",a);
}輸出2
每個函數都有自己的變量空間,參數也位于這個獨立空間內,和其他函數無關
?(2)本地變量
定義在函數內部的變量就是本地變量
- 本地變量是定義在塊內的。
- 它可以是定義在函數的塊內
- 也可以定義在語句的塊內
- 甚至可以隨便拉一對大括號來定義變量
? ? 2. 程序運行進入這個塊之前,其中的變量不存在,離開這個塊,?變量就消失了。
int main(){int a=2;int sum=0;{int b=40;}sum=b+a;return 0;
} [Error] 'b' was not declared in this scopeint main(){int a=2,c=0;int sum=0;if(c==0){int b=40;}sum=b+a;return 0;
} [Error] 'b' was not declared in this scope
3.?塊外面定義的變量在里面仍然有效
int main(){int a=2;{int b=40;printf("%d",a);}return 0;
} 輸出2
4.??塊里面定義了和外面同名的變量則掩蓋了外面的。
int main(){int a=2;{int a=2000;int b=40;printf("%d",a);}return 0;
} 輸出2000
5. 不能在一個塊內定義同名的變量
6. 本地變量不會被默認初始化
7. 參數在進入函數的時候被初始化了
因為實參給形參傳遞值了,這個值初始化參數了
8,其他
(1)函數不能嵌套定義
(2)逗號運算符 與 函數調用的括號區分
fact(a,b);? //認為是標點符號
fact((a,b));? //先算括號里面的(逗號運算符),再傳參
(3)int i,j,sum(int a, int b);
定義了i,j變量。 sum函數? 不建議這么寫
(4)return (i);? ? ?
這個括號沒什么意義 ,還容易使人誤解調用return 函數
(5)int main()函數
return 0;
把0返回給調用它那個的代碼.? 之后上報給系統(windows),執行相應功能
若返回為非0 ,一般會出錯
(6)不定型
#include <stdio.h>
void fact(); //不確定參數
int main(){int a=2;int b=6;fact(a,b); //根據實參,編譯器默認給你準備了兩個int形參return 0;
} void fact(int a,int b) //定義時,一樣。符合。那就行了
{printf("a = %f\n",a);printf("b = %f",b);
}
這樣寫,有的編譯器會報錯的
9,全局變量
定義在函數外,而不屬于任何函數的變量稱為全局變量
默認賦值為0
定義全局指針,默認NULL
(1)改變全局變量
#include <stdio.h>
int x; //定義全局變量
void fact(int num_1);
int main(){int a;x=0; //初始化全局變量x,使他的值為0a=2;fact(a);printf("%d",x);return 0;
} void fact(int num_1)
{x=num_1; //全局變量的值改變了
}輸出2
(2)若同名參數
int x; //定義全局變量
int fact();
int main(){int a;int b,sum=0;x=1; //全局變量值為1a=2;b=fact();sum=a+b+x;printf("a=%d b=%d x=%d\n",a,b,x);printf("sum = %d",sum);return 0;
} int fact()
{int x=4; //x為局部變量,在本函數中,全局變量x不起作用,所以x的值不變return x;
}輸出 a=2 b=4 x=1sum = 7
(3)?全局變量盡量不要有聯系
例如這樣??
#include <stdio.h>
int a=12;
int b=a;
int main(){printf("%d",b);return 0;
}非常不建議
10,靜態局部變量
?(1)定義
static 類型名 變量表
?(2)只能作用于所定義的函數內
賦值,只在第一次調用起作用。若沒有賦值,默認為0
//某個函數(求階乘)
int fact(num_1)
{ static int product=1; //定義局部變量為1,下次調用時,接上次的值(意思是下次調用時,值不再是1)product=product*num_1; //上次的值,再乘以num_1return x;
}
(3)靜態局部變量就是特殊的全局變量
#include <stdio.h>
int a=12;
void f();
int main(){f();return 0;
}void f(){int c=5;static int b=3;printf("a = %p\n",&a);printf("b = %p\n",&b);printf("c = %p\n",&c);
}輸出:
a = 0000000000403010
b = 0000000000403014
c = 000000000062FDECa,b地址位于相同內存區域
本地變量c位于另一個內存區域
靜態局部變量是
全局生存期
本地作用域(函數內的局部作用域,只能在函數內部訪問)
11,返回指針的函數
- 返回本地變量地址的函數很危險
#include <stdio.h>
int* f(int c);
int* g(int x);
int main(){int* p=f(5);printf("%d\n",*p);p=g(5);printf("%d",*p);return 0;
}int* f(int c){int num=5;return #
}int* g(int x){int num_1=12;return &num_1;
}輸出:
5
num_1= 6487516
12
f和g兩個函數之間存在什么關系?為什么f里的i和g里的k的地址是一樣的?
f函數調用完以后,占用的內存就釋放了,這時候立馬就調用g函數了,將f函數釋放的內存又分配給g函數了,這樣f里的i和g里的k的地址就是一樣的了
12,題目
以下哪句不是正確的函數原型?? ? ?D
A.int f();
B.int f(int i);
C.int f(int);
D.int f() {}
A選項,沒有寫參數,則是不定型參數,是可以定義的
D選項,類比int main()函數。 要有返回值
對于不返回值而且只有一個int類型的參數的函數,以下哪些函數原型是正確的???A,B,C
A.void f(int x);
B.void f();
C.void f(int);
D.void f(x);
B選項,不定型參數。編譯器會根據函數調用時,你給的參數判斷
D選項,沒有參數的類型
int x = 5, y = 7;
void swap ( )
{int z ;z = x ; ?x = y ; ?y = z ;
}
int main(void)
{int x = 3, y = 8;swap ( ) ;printf ("%d,%d \n", x , y ) ;return 0 ;
}輸出:3,8先調用swap()函數,因為沒有傳參數,所以使用的是全局變量,進行交換。之后退出函數,返回main()函數里,因為main()函數定義了x,y.所以又把全局變量給掩蓋了,所以輸出的是3,8
總結
以上是生活随笔為你收集整理的C语言 函数(做个笔记)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人字开头成语有哪些?
- 下一篇: 求本周所有宠物巅峰战力