提交谷歌网站,格兰仕网站开发方案,网络推广平台网站推广,做自己卖东西的网站函数传参#xff1a;
1、形参变量属于它所在的函数#xff0c;出了该函数就不能使用
2、实参与形参之间都是以赋值的形式进行数据传递#xff08;值传递#xff09;
3、return 其实是把返回值数据放置到一个公共的区域#xff08;函数和函数调用者#xff09;#xff0…函数传参
1、形参变量属于它所在的函数出了该函数就不能使用
2、实参与形参之间都是以赋值的形式进行数据传递值传递
3、return 其实是把返回值数据放置到一个公共的区域函数和函数调用者如果不写return语句那么该区域中就是一个随机的垃圾数据
4、数组作为函数参数传递时长度会丢失需要额外增加一个变量把数组的长度也传递过去。
5、函数之间数组的传递时址传递函数与函数的调用者可以共享数组练习1实现一个函数找出数组中的最大值
#includestdio.hint func(int a[],int len)
{int maxa[0];for(int i1;ilen;i){if(maxa[i])maxa[i]; }return max;
}int main(int argc,const char* argv[])
{int a[10]{0,1,2,3,4,5,6,7,8,155};int max func(a,sizeof(a)/sizeof(a[0]));printf(%d,max);
}练习2实现一个函数对数组进行排序
#includestdio.hvoid func(int a[],int len)
{int change;for(int i0;ilen;i){for(int ji1;jlen;j){if(a[i]a[j]){changea[i];a[i]a[j];a[j]change;}}}
}int main(int argc,const char* argv[])
{int a[10]{15,95,18,19,47,85,63,25,98,46};int lensizeof(a)/sizeof(a[0]);func(a,len);for(int i0;ilen;i){printf(%d ,a[i]); }
}练习3实现一个函数查找数组中是否存在某个值如果存在则返回该数据在数组中的下标否则返回-1
#includestdio.hint func(int a[],int len,int n)
{for(int i0;ilen;i){if(a[i]n)return i; }return -1;
}int main(int argc,const char* argv[])
{int a[10]{0,2,1,3,4,5,6,7,8,9};int lensizeof(a)/sizeof(a[0]);int retfunc(a,len,1);if(ret)printf(%d,ret);else printf(none);
}设计函数时的准则
1、一个函数最好只解决一个问题这样可以降低出错率提高可读性。
2、最好不要依赖其他函数。降低耦合性
3、数据由调用者提供结果返回给调用者提高通用性
4、要考虑调用者提供的非法数据可以通过返回值方式告诉调用者或者把可能出现的情况通过注释的方式写明白健壮性进程映像
程序储存在磁盘上的可执行文件(二进制文件、脚本文件)
进程正在系统中运行的程序
进程映像指的是进程内存的分布情况text 代码段 存储二进制指令、常量权限是只读强制修改会产生段错误
data 数据段 存储初始化过的全局变量、初始化过的静态局部变量
bss 静态数据段 存储未初始化过的全局变量未初始化过的静态局部变量程序运行时会被清理为0
stack 栈 存储局部变量、块变量会随着程序运行不断申请、释放由操作系统管理小
heap 堆 由程序猿手动管理足够大局部变量和全局变量
局部变量 定义在函数内存储位置 stack 栈生命周期 函数调用开始直到知道函数执行结束使用范围 函数内使用全局变量 定义在函数外存储位置 data初始化、bss未初始化生命周期 运行前就定义完成程序结束才释放适用范围 程序的任何位置都可以使用块变量 定义在语句块内的 if{} for(){} while(){}存储位置 stack 栈生命周期 函数调用开始直到知道函数执行结束使用范围 只能在语句块内使用
注意1、局部变量可以和全局变量同名但是会屏蔽同名的全局变量同名块变量也会屏蔽同名的全局变量和局部变量2、建议全局变量首字母大写存储介质
硬盘-内存-高级缓存-寄存器类型限定符
auto 用于定义自动申请、自动释放内存的变量局部变量不加就代表加注意全局变量不能用auto修饰C11标准中auto用于自动类型识别auto num 3.14
extern 声明变量意思是说明此变量已在别处定义过了请放心使用。但是只能临时通过编译链接时找不到该变量依然会报错声明时不可赋值
static被它修饰过的局部变量叫静态局部变量改变存储位置改变局部变量的储存位置由stack改到data或bss由是否初始化决定改到那个段延长生命周期 延长局部变量的生命周期限制作用域限制全局变量、函数只能在本文件中使用可以防止全局变量、函数被别人调用可以防止防止命名冲突
const:“保护”变量不被显示地修改注意如果对初始化过的全局变量、初始化过的静态局部变量使用const修饰那么存储位置会变成text
volatile:如果变量值没有显示地改变那么在使用这个变量时不会从内存中读取而是继续用上次读取的结果这叫编译器的取值优化。如果变量被volatile修饰后每次使用该变量时不做取值优化每次都从内存中读取。一般在硬件编程、多线程编程时经常使用
register申请把变量的存储介质由内存改为寄存器。但是由于寄存器有限所以不一定能申请成功注意寄存器变量不允许获取地址
typedef类型重定义定义变量前如果加入typedef那么变量名就变成了这个类型注意不是替换关系#define num int 替换typedef int num; 类型重定义从使用角度看一样递归
函数自己调用自己的行为有可能会造成死循环
递归可以实现分治这种算法就是把一个复杂的大问题分解成若干个相同的小问题直到问题解决1、出口问题2、解决一个小问题3、调用自己计算出第n个斐波那契数列
int func(int n)
{if(1 n||2 n) return 1;return func(n-1)func(n-2);
}
1 1 2 3 5 8 13.......递归函数每调用一次都会在栈内产生一份自己的拷贝直到到达出口才会一层一层的释放因此使用递归时非常耗费内存
与循环相比速度非常慢能使用循环解决就用循环解决。不要试图分解递归的过程递归优缺点1、耗内存、速度慢2、好理解、思路清晰3、可以解决非线性的执行过程作业
1、用编程模拟汉诺塔的移动过程#includestdio.hvoid show(char a,char c,int n)
{printf(%d %c-%c\n,n,a,c);
}void func(int n,char a,char b,char c)
{if(n1)show(a,c,n);else{func(n-1,a,c,b);show(a,c,n);func(n-1,b,a,c);}
}int main(int argc,const char* argv[])
{int n;scanf(%d,n);func(n,A,B,C);return 0;
}2、输入一个整数计算出0~9每个数字出现几次#includestdio.hvoid func(int n,char a[])
{if(n0)return;a[n%10];func(n/10,a);
}int main(int argc,const char* argv[])
{int n;scanf(%d,n);char a[10]{};func(n,a);for(int i0;i10;i){printf(%hhd:%hhd ,i,a[i]); }
}