文章目录　函数　调用　函数　定义　函数　:return语句指针定义指针解　引用　指针的应用　函数　调用　函数　输入一个直角三角形的斜边和其中一个锐角角度,求另两个直角边　(输入的角度为数字,需要变成度数,要/180*派)　#include　<...　文章目录　1.　函数　调用函数　输入一个直角三角形的斜边和其中一个锐角角度,求另两个直角边:　(输入的角度为数字,需要变成度数,弧度=角度/180*派)　#include　<　stdio　.　h　>　#include　<　math　.　h　>　int　main　(　)　{　int　c　,　alpha　;　scanf　(　"%d%d"　,　&　c　,　&　alpha　)　;　float　a　=　c　*　sin　(　alpha　/　180.0　*　3.1415　)　;　float　b　=　c　*　cos　(　alpha　/　180.0　*　3.1415　)　;　printf　(　"a=%f\nb=%f\n"　,　a　,　b　)　;　}　编译:gcc　triangle.c　-o　triangle　-lm　结果为:　6　30　a　=　2.999920　b　=　5.196199　定义函数　输入三条边长度,计算三角形周长:　#include　<　stdio　.　h　>　#include　<　math　.　h　>　int　Length　(　int　a　,　int　b　,　int　c　)　{　return　a　+　b　+　c　;　}　int　main　(　)　{　int　x　,　y　,　z　;　scanf　(　"%d%d%d"　,　&　x　,　&　y　,　&　z　)　;　int　len　=　Length　(　x　,　y　,　z　)　;　printf　(　"%d\n"　,　len　)　;　return　0　;　}　结果为:　输入三条边长度,计算三角形面积:　海伦公式:s　=　sqrt(p*(p-a)　*　(p-b)　*　(p-c))　公式中a,b,c分别为三角形三边长,p为半周长,S为三角形的面积　#include　<　stdio　.　h　>　#include　<　math　.　h　>　int　Length　(　int　a　,　int　b　,　int　c　)　{　return　a　+　b　+　c　;　}　int　Area　(　int　a　,　int　b　,　int　c　)　{　float　p　=　Length　(　a　,　b　,　c　)　/　2.0　;　float　s　=　sqrt　(　p　*　(　p　-　a　)　*　(　p　-　b　)　*　(　p　-　c　)　)　;　return　s　;　}　int　main　(　)　{　int　x　,　y　,　z　;　scanf　(　"%d%d%d"　,　&　x　,　&　y　,　&　z　)　;　int　len　=　Length　(　x　,　y　,　z　)　;　printf　(　"len=%d\n"　,　len　)　;　float　s　=　Area　(　x　,　y　,　z　)　;　printf　(　"area=%f\n"　,　s　)　;　return　0　;　}　结果为:　3　4　5　len　=　12　area　=　6.000000　return语句　中断　当前　函数　的执行,并返回一个　值　没有返回值的函数用void　void　函数(参数列表)　2.　指针　是一个变量,他是　存放地址　的　变量　取地址用&,对应%p　定义指针　类型　*　指针变量;　int*　p;　p　=　&n;　printf("%p\n",p);　p　中的存放的就是　n的地址　查看n的值,n的地址,p的值:　#include　<　stdio　.　h　>　int　main　(　)　{　int　n　=　100　;　int　*　p　;　p　=　&　n　;　printf　(　"p=%p\n"　,　p　)　;　printf　(　"&n=%p\n"　,　&　n　)　;　printf　(　"n=%d\n"　,　n　)　;　}　结果为:　p　=　0x7ffff8503c04　&　n　=　0x7ffff8503c04　n　=　100　解引用　把指针　对应地址　中的　值　取出来　printf("%d\n",*p);　验证p解引用的值就是n的值:　#include　<　stdio　.　h　>　int　main　(　)　{　int　n　=　100　;　int　*　p　;　p　=　&　n　;　printf　(　"p=%p\n"　,　p　)　;　printf　(　"&n=%p\n"　,　&　n　)　;　printf　(　"n=%d\n"　,　n　)　;　printf　(　"*p=%d\n"　,　*　p　)　;　n　=　200　;　printf　(　"n=%d\n"　,　n　)　;　printf　(　"*p=%d\n"　,　*　p　)　;　n　=　300　;　printf　(　"n=%d\n"　,　n　)　;　printf　(　"*p=%d\n"　,　*　p　)　;　}　结果为:　p　=　0x7fffe8697014　&　n　=　0x7fffe8697014　n　=　100　*　p　=　100　n　=　200　*　p　=　200　n　=　300　*　p　=　300　指针的应用　值传递　我们先看一个例子　试图通过函数来改变n的值:　#include　<　stdio　.　h　>　void　func　(　int　n　)　{　printf　(　"func1　n[%p]:%d\n"　,　&　n　,　n　)　;　n　=　200　;　printf　(　"func2　n[%p]:%d\n"　,　&　n　,　n　)　;　}　int　main　(　)　{　int　n　=　100　;　printf　(　"main1　n[%p]:%d\n"　,　&　n　,　n　)　;　func　(　n　)　;　printf　(　"main2　n[%p]:%d\n"　,　&　n　,　n　)　;　}　结果为:　main1　n　[　0x7ffdb563312c　]　:　100　func1　n　[　0x7ffdb563310c　]　:　100　func2　n　[　0x7ffdb563310c　]　:　200　main2　n　[　0x7ffdb563312c　]　:　100　我们发现:　调用函数的操作无法改变主函数变量的值　其中　func(n);　只是把n的值传给参数　main函数中的n　和func中的n　只是名字相同,其他都　不同　而void　func(int　n)　与外面　无关　如果非要有关,可以通过这种方式同步变量:　#include　<　stdio　.　h　>　void　func　(　int　*　p　)　{　printf　(　"func1　n[%p]:%d\n"　,　p　,　*　p　)　;　*　p　=　200　;　printf　(　"func2　n[%p]:%d\n"　,　p　,　*　p　)　;　}　int　main　(　)　{　int　n　=　100　;　printf　(　"main1　n[%p]:%d\n"　,　&　n　,　n　)　;　func　(　&　n　)　;　printf　(　"main2　n[%p]:%d\n"　,　&　n　,　n　)　;　}　结果为:　main1　n　[　0x7ffc2d02703c　]　:　100　func1　n　[　0x7ffc2d02703c　]　:　100　func2　n　[　0x7ffc2d02703c　]　:　200　main2　n　[　0x7ffc2d02703c　]　:　200　函数无法改变变量的值,但是指针可以　在函数中通过对地址的操作,改变变量的值。　理解输入函数:scanf("%d",&n);　交换两个变量编辑为函数(需要用指针的方式)　如果不使用指针:　#include　<　stdio　.　h　>　void　swap　(　int　x　,　int　y　)　{　printf　(　"x:%d　y:%d\n"　,　x　,　y　)　;　int　t　=　x　;　x　=　y　;　y　=　t　;　printf　(　"x:%d　y:%d\n"　,　x　,　y　)　;　}　int　main　(　)　{　int　a　=　10　;　int　b　=　20　;　printf　(　"a:%d　b:%d\n"　,　a　,　b　)　;　swap　(　a　,　b　)　;　printf　(　"a:%d　b:%d\n"　,　a　,　b　)　;　}　结果为:　a　:　10　b　:　20　x　:　10　y　:　20　x　:　20　y　:　10　a　:　10　b　:　20　函数中的操作无法改变主函数中变量的值　但,如果使用指针进行操作:　#include　<　stdio　.　h　>　void　swap　(　int　*　x　,　int　*　y　)　{　printf　(　"*x:%d　*y:%d\n"　,　*　x　,　*　y　)　;　int　t　=　*　x　;　*　x　=　*　y　;　*　y　=　t　;　printf　(　"*x:%d　*y:%d\n"　,　*　x　,　*　y　)　;　}　int　main　(　)　{　int　a　=　10　;　int　b　=　20　;　printf　(　"a:%d　b:%d\n"　,　a　,　b　)　;　swap　(　&　a　,　&　b　)　;　printf　(　"a:%d　b:%d\n"　,　a　,　b　)　;　}　结果为:　a　:　10　b　:　20　*　x　:　10　*　y　:　20　*　x　:　20　*　y　:　10　a　:　20　b　:　10　再看一个例子　通过输入地址,改变该地址下的值:　#include　<　stdio　.　h　>　void　func　(　)　{　int　*　p　;　scanf　(　"%p"　,　&　p　)　;　*　p　=　100　;　}　int　main　(　)　{　int　a　=　10　;　int　b　=　20　;　printf　(　"a:%d　b:%d\n"　,　a　,　b　)　;　printf　(　"&a:%p\n"　,　&　a　)　;　printf　(　"&b:%p\n"　,　&　b　)　;　func　(　)　;　printf　(　"a:%d　b:%d\n"　,　a　,　b　)　;　}　用a的地址改a的值:　a　:　10　b　:　20　&　a　:　0x7ffd11ae72dc　&　b　:　0x7ffd11ae72d8　0x7ffd11ae72dc　a　:　100　b　:　20　用b的地址改b的值:　a　:　10　b　:　20　&　a　:　0x7ffcefa57fbc　&　b　:　0x7ffcefa57fb8　0x7ffcefa57fb8　a　:　10　b　:　100　输入参数a和b,同时获取a与b的商和余数:　(除数为0则报错)　#include　<　stdio　.　h　>　int　count　(　int　a　,　int　b　,　int　*　div　,　int　*　rem　)　{　if　(　b　==　0　)　{　return　0　;　}　else　{　*　div　=　a　/　b　;　*　rem　=　a　%　b　;　return　1　;　}　}　int　main　(　)　{　int　a　,　b　;　scanf　(　"%d%d"　,　&　a　,　&　b　)　;　int　div　,　rem　;　int　ok　=　count　(　a　,　b　,　&　div　,　&　rem　)　;　if　(　ok　==　0　)　{　printf　(　"除数不能为0\n"　)　;　}　else　{　printf　(　"商为%d　余数为%d\n"　,　div　,　rem　)　;　}　}　结果为:　25　3　商为　8　余数为　1　结果或为:　23　0　除数不能为　0　实现二元一次方程求根,输入参数a、b、c,返回是否有根,如果有根则返回两个根　#include　<　stdio　.　h　>　#include　<　math　.　h　>　int　root　(　int　a　,　int　b　,　int　c　,　int　*　x1　,　int　*　x2　)　{　if　(　a　==　0　||　b　*　b　-　4　*　a　*　c　<　0　)　return　0　;　*　x1　=　(　(　-　b　)　+　sqrt　(　b　*　b　-　4　*　a　*　c　)　)　/　(　2　*　a　)　;　*　x2　=　(　(　-　b　)　-　sqrt　(　b　*　b　-　4　*　a　*　c　)　)　/　(　2　*　a　)　;　return　1　;　}　int　main　(　)　{　int　a　,　b　,　c　;　scanf　(　"%d%d%d"　,　&　a　,　&　b　,　&　c　)　;　int　x1　,　x2　;　int　ok　=　root　(　a　,　b　,　c　,　&　x1　,　&　x2　)　;　if　(　ok　)　{　printf　(　"x1:%d　x2:%d\n"　,　x1　,　x2　)　;　}　else　{　printf　(　"error\n"结果是:　2　6　3　x1　:　0　x2　:　-　2　小知识:　bool类型　:　和int