函數(shù)?
相當(dāng)于功能模塊章咧,通過調(diào)用函數(shù),能直接實(shí)現(xiàn)函數(shù)的功能
函數(shù)定義: 返回值類型 函數(shù)名(參數(shù)){
函數(shù)體
}
作用: 避免寫大量的重復(fù)代碼
能夠使代碼更加精簡(jiǎn)
四種形式:?
無參無返回值
void name ();
無參有返回值
int name ();
有參無返回值
int name (int a,int b);
有參有返回值
返回值類型: 無返回值類型倍宾,寫成 void
C語(yǔ)言中不能返回?cái)?shù)組
如果有返回值,必須使用return返回
函數(shù)名: 命名規(guī)范和變量名一樣胜嗓,與返回值類型用空格隔開
參數(shù): 放在與函數(shù)名緊挨著的括號(hào)內(nèi)高职,括號(hào)內(nèi)可以有多個(gè)參數(shù),每個(gè)參數(shù)都要指定數(shù)據(jù)類型辞州,不管數(shù)據(jù)類型是否相同
return: 返回指定的數(shù)據(jù)類型怔锌,由函數(shù)的返回值類型決定什么類型的數(shù)據(jù)
碰到return,函數(shù)執(zhí)行結(jié)束,return后面的代碼不再執(zhí)行
// 不能在函數(shù)里面調(diào)用函數(shù)
函數(shù)調(diào)用: 當(dāng)函數(shù)定義在調(diào)用處的下面時(shí)埃元,需要函數(shù)聲明(函數(shù)聲明:將函數(shù)的大括號(hào)變成分號(hào)涝涤,放在調(diào)用處所在函數(shù)的上面? void printfHelloWorld();)
函數(shù)定義在調(diào)用處所在函數(shù)的上面時(shí),不需要函數(shù)聲明
* 1. 建文件 點(diǎn)擊你想放的位置->Command+N->OS X->Source->C file
* 2. 在.h 里面聲明一個(gè)函數(shù)岛杀, .c 實(shí)現(xiàn)這個(gè)函數(shù)
* 3. 該文件內(nèi)導(dǎo)入該文件的頭文件,也就是.h文件
* 4. 直接調(diào)用函數(shù)就行
函數(shù)的嵌套調(diào)用
/*
* s = (2*2)! + (3*3)! +(4*4)!
* 1阔拳、整型數(shù)的平方
* 2、一個(gè)整型數(shù)的階乘
* 3类嗤、三個(gè)整形的平方的階乘的和
*/
#includeint method2(int a)
{
int sum = 1;? // 用sum獲取到a的階乘
for (int i = 1; i<=a; i++)
?{
sum *= i;
}
return sum;
}
int method1(int n){
int sum = 0; //sum接受最終的結(jié)果
for (int i = 2; i<=n; i++)?
{
//? ? sum +=i*i;? (用一個(gè)函數(shù)計(jì)算階乘)
sum += method2(i*i);? //通過method2獲取到i值平方的階乘糊肠,再通過sum累加i值平方的階乘
}
return sum;
}
int main(){
int sum = method1(4);
printf("%d\n",sum);
}
遞歸函數(shù)
/*
本質(zhì):自己調(diào)用自己
5! (jiecheng(5))
? ? ? ?5*4! (5*jiecheng(4))
? ? ? ? ? ?4*3! (4*jiecheng(3))
? ? ? ? ? ? ? ? 3*2! (3*jiecheng(2))
? ? ? ? ? ? ? ? ? ? 2*1! (2*jiecheng(1))
#includeint jiecheng (int n){
if (n == 1)?
{
return 1;
}
return n*jiecheng(n-1);
}
int main (){
printf("n的階乘=%d\n",jiecheng(5));
}
結(jié)構(gòu)體概念
結(jié)構(gòu)體:也相當(dāng)于一個(gè)容器遗锣,與數(shù)組的本質(zhì)區(qū)別在于货裹,數(shù)組只能存放一種數(shù)據(jù)類型,而結(jié)構(gòu)體能夠存放多種數(shù)據(jù)類型
結(jié)構(gòu)體能夠直接復(fù)制精偿,可以通過結(jié)構(gòu)體的這種特性弧圆,讓數(shù)組直接賦值
利用結(jié)構(gòu)體可以創(chuàng)造多種數(shù)據(jù)類型
結(jié)構(gòu)體的聲明
格式:struct 結(jié)構(gòu)體名
{
屬性類型 屬性名1;
屬性類型 屬性名2;
...
屬性類型 屬性名n;
};
定義結(jié)構(gòu)體變量
?結(jié)構(gòu)體名字 結(jié)構(gòu)體變量 = 初值;
? ?修改結(jié)構(gòu)體變量的內(nèi)容,通過給結(jié)構(gòu)體變量.相應(yīng)的屬性來賦值或者取值
定義過的結(jié)構(gòu)體變量还最,不能再通過大括號(hào)來賦值
結(jié)構(gòu)體的優(yōu)化
? typedef 能夠給數(shù)據(jù)類型重命名
格式:typedef type name
type:原數(shù)據(jù)類型的名字
name:重新給原數(shù)據(jù)類型設(shè)置的名字
結(jié)構(gòu)體嵌套
typedef struct Brithday{? //創(chuàng)建一個(gè)學(xué)生體并重命名
int year;
int month;
int day;
}Brithday;
typedef struct Student{? //創(chuàng)建一個(gè)學(xué)生體并重命名
char name[20];
Brithday brithday; //結(jié)構(gòu)體的嵌套墓阀,也可以不嵌套,用結(jié)構(gòu)體Brithday的內(nèi)容替換
}Student;
int main (){
Student pangrenmeng = {"pang",{1993,03,16}};
int month = pangrenmeng.brithday.month;
指針概念
1.計(jì)算機(jī)在內(nèi)存中存放數(shù)據(jù)拓轻,首先需要為數(shù)據(jù)找到一塊地址
2.每塊地址都有一個(gè)編號(hào)斯撮,通過編號(hào)找到這塊地址
3.地址的編號(hào)其實(shí)就是指針
4.指針指向的就是計(jì)算機(jī)磁盤內(nèi)的一塊地址
5.指針變量:就是用來存儲(chǔ)地址的
格式:
數(shù)據(jù)類型 *變量名 = 賦初值;
'*'就是一個(gè)標(biāo)志符:用來表明這個(gè)變量是指針變量
數(shù)據(jù)類型:用來指示變量所指向的地址,存放什么樣的數(shù)據(jù)
賦初值:因?yàn)槎x的是指針變量扶叉,所以賦初值時(shí)要給一個(gè)地址
'&'取地址符
格式:
&變量名
在變量名前加一個(gè)&勿锅,就代表取到了該變量所在的地址
取值運(yùn)算符
取值格式:
*指針變量
在變量的前面一個(gè)*代表取出來改地址的值
使用指針來交換兩個(gè)變量的值
int i = 3;
int e = 7;
int * r = &i;
int * t = &e;
int temp = 0;
temp = *r;
*r = *t;
*t = temp;
printf("i = %d\ne = %d\n",*r,*t);
int y = 7;
int x = 9;
int * s= &y;
int * z= &x;
int temp1 = 0;
temp1 = *s;
*s = *z;
*z = temp1;
printf("y = %d\nx = %d\n",*s,*z);
指針與數(shù)組
數(shù)組: 定義一個(gè)數(shù)組,系統(tǒng)會(huì)分配一塊連續(xù)的內(nèi)存空間枣氧,數(shù)組名就是該數(shù)組里面第一個(gè)元素的地址
數(shù)組名就是一塊地址
char *strings[3] = {"iPhone" , "Android" ,"win8"};
printf("%c\n%s\n%s\n",*(strings[1]+1),*(strings+1),*(strings+2));
指針與字符
char string[] = "awfr2";
char test = *(string+1);
*string = test;
*(string+1) = 'q';
*(string+4) = 'q';
printf("%s\n",string);
結(jié)構(gòu)體指針
// 定義一個(gè)英雄結(jié)構(gòu)體
typedef struct Hero
{
char name[10];
int blood;
char sex;
}Hero;
int main() {
Hero gailun = {"gailun",350,'m'}; ? //定義一個(gè)Hero類型的指針
Hero *p = &gailun; ?//讀取Hero類型指針里面的數(shù)據(jù)
printf("%s的一級(jí)血量是%d\n",(*p).name,(*p).blood);
Hero datou ={"datou",300,'m'};
Hero *p1 = &datou;
printf("%s的一級(jí)血量是%d\n",(*p1).name,(*p1).blood);
結(jié)構(gòu)體數(shù)組
int main(){
Hero gailun = {"gailun",350,'m'};
Hero aixi = {"aixi",300,'w'};
Hero ruizi = {"ruizi",500,'m'};
// 定義一個(gè)結(jié)構(gòu)體數(shù)組
// 數(shù)組名代表的是數(shù)組的第一個(gè)元素的地址
Hero list[] = {gailun,aixi,ruizi};
//定義一個(gè)結(jié)構(gòu)體指針溢十,用來存放地址
Hero *hero = list;
printf("%s的血量%d\n",(*hero).name,(*hero).blood);
printf("%s的血量%d\n",(*(hero+1)).name,(*(hero+1)).blood);
printf("%s的血量%d\n",(*(hero+2)).name,(*(hero+2)).blood);
指針的指針
int main(){
//定義變量a 系統(tǒng)給地址
int a = 6;
//定義一個(gè)指針變量,系統(tǒng)還會(huì)給地址
int *p = &a;
//定義一個(gè)指針變量达吞,來存儲(chǔ)變量p的地址
int **pp = &p;
//通過雙星找到指針的指針里面的值
printf("a=%d\n",**pp);