1.函数
函数也叫方法、子例程或程序。
函数包括:返回值类型,参数,函数名称,函数主体。
写到函数名称,提及一下变量的命名规则,变量命名以数字,下划线_ ,大小写字母构成。
开头字母或者下划线,不能数字。
1.主函数解析:main:函数名也叫主函数
int main()//小括号内部也叫参数,参数可有可无,但是()不能省略
//
{
函数体;//具体操作
return 0;
}
int 为返回值类型也就是return的后面的值的类型;是什么类型就返回什么类型
或者不返回,就写void类型。
子函数
声明函数:当子函数写在主函数之后时,需要声明函数,格式为;
函数返回值类型 函数名(参数类型,参数类型);//也就是函数加了一个分号
void swapNum(int *,int *);
//函数名命名时采用小驼峰式命名法。当命名有两个英文单词时第
//二个英文单词首字母大写
调用函数:函数名(参数列表);
scanf("%d,%d",&num1,&num2);
int num=getMax(num1,num2);
//这里参数为实际参数将输入的num1,num2传递给子函数中的形参
这里涉及参数传递
参数传递
分为; 为传值操作和传址操作;顾名思义
传值操作就是将实参的具体值传递给形参,上代码。
int getMax(int x, int y) {
// 求两个数的最大值
int max = x;
if (x < y) {
max = y;
}
return max;
}
下面的是主函数部分语句
scanf("%d%d", &num1, &num2);
max = getMax(num1,num2);
调用max函数就是实参num1,num2传值操作
传递给这里上面的(int x,int y),当还未传递时这里的形参还不知道它是什么具体值。相当于空有框架。只知道要接受两个int类型的变量。
这里也可以这样理解,将实际参数n1,n2拷贝一份到子函数中进行操作,只是对他的仿造品进行操作,当子函数结束时这里的局部变量x,y便会销毁也就是仿制品没了,num1,还是num1,num2,还是num2,传递回来的max只是被销毁前传递出来的一个值。所以出去旅游只是一时,还是要回来学习。
还有一种特殊的传值调用也就是
max = getMax(&num1,&num2);
这里的实参传递的是一个地址,通常我们会将之理解为传址操作
但是恰恰相反,我今天也才知道这个时传值调用,虽说传递的时num1,num2.的地址,姑且将他认为是0x000000078 0x00000000074吧这里的地址也是一个值。所以传递的是值。
在子函数接收时函数参数类型就应该为(int* x,int* y)这里的int* 代表的时int类型的指针。注意当用(int x,int y)来接收时打印出来的自然而然时num1,num2的地址0x000000078 0x00000000074,所以int*的作用就是指向这个int类型地址。这里就是找上门了,对之进行的操作就是对本尊进行插入,转换了,自然而然主函数中的num1,num2,也跟着操作变换
我来解释一下(抹头发)(int* x,int* y)
int getMax(int* x,int* y);
// 求两个数的最大值
int max = *x;//解引用
if (*x < *y) {
max =*y;
}
return max;
}
这里的形参仅仅只是声明两个int类型的指针的变量,开辟了两个int*类型的空间,里面是什么也没有等待本尊实参(不一定是主函数,说不定时子函数调用子函数)给他传递两个地址类型的值,不能传递不同类型的值,所以用&,这里的int*就是类型,不要和解引用搞混淆。
*x 这里的*为解引用运算符,原本x是一个地址0x000000078
加了*便成为6(随便输的一个int类型值)。
总结,
有返回值时就看return什么类型,函数名前面就是什么类型。
不想返回就时void。 扩展(void*)任意指针类型可不是空指针类型。
当想对这个变量进行改变或者后续操作还会用到这个改变后的变量时,实参就应该为变量的地址值。
局部变量,全局变量;
局部变量的定义为,在函数内部声明的变量就是局部变量与是否在主函数与子函数无关
全局变量为在函数外部生命的变量。所以
凡是函数内部声明的变量就是局部变量。
这里有句话我查阅资料
全局变量的默认作用域是整个程序,也就是所有的代码文件,包括源文件(.c
文件)和(头文件.h)也就是你创建的整个项目