函数
在函数的声明中,形参的名字可以省略
函数的定义是一种特殊的声明
数组在传参的时候,形参的数组和实参的数组是同一个数组
函数在设计的时候,尽量功能单一
形参和实参的名字是可以一样的
数组在传参的时候,实参就写数组名就行,形式也是数组的形式
如果函数要求返回值,但是函数中没有使用return返回值,那具体返回什么就不确定了
其实编译器在编译代码的时候,就为静态变量分配了地址,而不是进入函数创建这种变量
自定义函数返回类型不是void时,自定义函数后面一定要加return…!!(是void的话,return后面要无内容或者不写return;)
函数定义里面的形式参数表不可以写为(intx,y)
函数执行到return语句中止
函数声明时形式参数表的比如:x,y可以删去
写为比如 int add(int , int)(即 函数定义时,形参变量名可以省略,形参类型不可以省略)
函数定义时不可省
实参类型要跟对应形参类型最好一致(自己是要一定一致,不然会出现错误结果)
自定义函数有比如 return a;
也可以在main函数里调用为add(x,y);(但此时不会返回a,因为还没有东西被a赋值)
函数声明时,形参变量名和函数定义时不一样也行,但是形参的类型要一致(参数类型的位置也要一致)
void类型自定义函数如果没有return语句,则执行到函数体结束的右大括号;
如果有return,那么到return语句处就返回调用处
主调函数如果不需要返回值,就不用临时变量来做中间传递
自定义函数没有参数时,可以在定义和声明时,()里面一会有void,一会没有、
自定义函数实参两个类型不一样时也可以做加减啥的
函数定义里面可以用全局变量(但如果局部变量与全局变量名重合,则用的是局部变量的数据)
传值调用时:当实参传递给形参时,形参是实参的一份临时拷贝,对形参的修改不会影响实参
传址调用则不同
区分传值调用和传址调用
实参的名字和形参的名字是可以相同的
自定义函数时,自己喜欢在后面加个own(比如:printf_own)
没有加特殊东西时,自定义函数里不能使用main函数里面的局部变量,但是可以使用全局变量
在C语言中,形参不可以是int arr 因为没有[]
自定义函数形参和实参的类型要一样
数组的形参不可以写为eg:int arr
void**和void在作自定义函数开头时,void 是返回一个指针,void是无返回值
数组
当对数组进行初始化时,数组的大小可以省略,编译器会根据数组的初始化内容,自动计算数组的元素个数 比如:arr[]
arr的随着下标的增长,地址是由小(低)到大(高)变化的
数组里面变量的个数称为数组长度或数组容量
数组元素的使用与普通变量相同
下标越界不会提醒失败,但运行之后会报错
数组里面可以运算(可以比如:2*4放里面)
数组里面的变量只能缺右面的,不可以先缺左面
数组也算是一个参数
调用函数时,实参去数组名,不可以数组名
[ ],但是形参需要数组名[ ]
一个数组不能给另一个数组整体赋值
错误示范:
假设数组名为B A 且类型、和变量数均相同
B=A
int B[5]=A
C规定数组不能整体使用,也就是不能整体赋值、整体输入、整体输出,每次只能使用里面的一个
二维数组所占的字节数=第一维长度 **第二维长度 sizeof(数据类型)
数据名的值是一个地址(eg:arr和&arr一样)
二维数组的eg:arr[ 1]也是地址(表示这行首个元素的地址,除非比如:arr[1 ][1]里面才是值
数组中每个元素的地址不同
二维数组缺省行数时:把给了的元素都按列数排好后,把剩余未齐那行补齐好了
二维数组的访问需用两层循环
char kind[7]={3,4,5,6,‘a’,}(这里的3,4,5,6,'a’是ascll值
数组不是地址,但是数组名是地址
数组可以用来储存多个字符串,比如 char arr[4][20]//可以储存四个长度不超过19的字符串
传参时,传的数组名是地址
二维数组的数组名是其第一行的地址
二维数组可以这样写
int arr [2][3] = {{1,2,3}
{4,5,6,}};
按地址方式来取二维数组,可以只用一次for循环
数组不是地址,数组名才是地址
数组作为形参的几种写法(由实参和形参的类型一样可以推出实参写啥)
以下是传递整个数组的几种写法(实参是数组名时的写法):
假设 int a[2] ={0};
形参:
a[2](但是此时的2没啥用,只能起到一个提醒作用,在实际上,如果传来的数组是3个元素的,也是可以传过来的))
a[](当时二维数组时,后面的列数要写出,这里就不只是提示作用了(比如:a[][2]))
int *a
数组名不可以++