goto原理:
当执行到goto语句的时候, cpu就会跳转到当前函数指定的标志的地方
使用goto也可以实现循环操作
但是在使用的时候,要注意不要造成死循环
一般情况下不建议经常使用goto语句,因为不安全——容易造成死循环
除非在特别确定不会有死循环的情况下,才可以用goto
goto不仅可以往前跳,还可以往后跳
使用goto时, 标签代码行的下一行代码不能是声明变量,如果非要写在这个地方,那就在声明变量行前面加一句无意义的代码
标示符: 通俗来讲就是程序员可以自己命名的东西: 变量名,goto标签名, 函数名等
面试题3
for(int i = 0; i<10; i++ ){ for(int j = 0; j<10; j++){ //用一段代码,直接跳出外层循环 i = 10; break } }
函数的作用:可以实现代码的重用,函数只需要顶一次,那么函数中的代码可以随意使用
使用函数的注意:
1.函数的位置:main函数的外面
全局变量与局部变量
初始化
1.局部变量:未初始化的时候,是一个随机数
2.全局变量:如果是一个数值,那么就默认初始化为0;如果是char,默认初始化为’\0’,即ASCII码中的0
创建时间
1.局部变量:当运行到声明语句的时候才会创建,出了所在作用域就会被回收
2.全局变量:程序运行时就会被创建,程序结束时才会被回收
全局变量的特点:
1 int num = 10; 2 int main(){ 3 printf(“%d\n”, num); //这里是访问的全局 4 int num = 10; 5 printf(“%d”\n, num); //这里是局部 6 }
函数的参数
1.声明在 函数名称后面的小括弧中的变量,我们就叫做这个函数的参数
形参与实参的关系:
赋值
return 可以带常量, 也可以带表达式 当return 表达式的时候, return的是表达式的结果
关于函数的声明和定义:
1.如果函数写了声明, 那么这个函数的定义就可以放在调用函数的后面了
2.函数的声明最晚也要放在函数调用之前,一般情况下写在最顶部
3.如果被调函数在主调函数之前,这个时候,被调函数的声明可以省略,直接写定义即可;如果被调函数的定义在主调函数的后面,那么这时候必须在调用之前声明被调函数
4.声明函数的函数投,必须要和实现函数的函数头一致(参数可以不一致,只不过返回值或者结果紊乱)
5.在声明函数的时候,如果函数有参数,那么参数的名称可以省略(但是强烈建议声明实现统一)
6.如果函数的返回值是int类型的,可以不写声明,因为缺省就是int类型的(但是会给出警告,所以还是要写一下的)
-=-=-=-=-=-=-函数编写规范-=-=-=-=-=-=-
1.main函数无论如何排在第一位
2.无论什么情况,函数都要写声明和实现
声明写在最顶部,#include 下面
实现写在main函数后面
3.声明和实现一致
指针之间的运算
为什么两个指针变量之间不能进行加法运算?以及乘法和除法
1.加法的话,加完以后有可能会越界,超出了数组的地址界限,溢出
2.乘除法同理
作用:
1.判断两个指针指向的变量是否是同一个,如果是,那么相减的结果是0
2.判断两个指针指向的变量是否相邻,如果是,那么相减的结果是正负1
两个指针变量(p1, p2)之间的关系运算
p2 > p1
结果等于1 p2在高位
结果等于0 p1在高位,或者指向同一个元素
二维数组与指针
有二维数组 int array[][] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}}
则易得: array[0] 为第一行的第一个元素,也是第一行的首地址
推理可得: array[0]+1, array[0]+2, array[0]+3 即为第一行的第2, 3, 4个元素
约定: array[0], array[0]+1, array[0]+2, array[0]+3 为二维数组中的列指针
又易得: array 为第一行的首地址
所以推理可得:array+1是 第二行的首地址
array+2是第三行的首地址
约定:array, array+1, array+2 为二维数组中的行指针
数组指针:
定义一个指针变量,让这个指针变量指向一维数组的元素
二维数组指针:
行指针: 用来指向二维数组的每一行,存放的是行的首地址
形式: 数据类型 (*指针变量名)(数组的第二维的长度)
二维数组指针的初始化
1 int a[2][3]; 2 int b[2][2]; 3 float f1[4][4]; 4 //假设要定义一个指向数组a的行指针 5 int (*pa)[3] = a[0]; //a[0] == a == &a[0] ==&a[0][0] 6 7 //二维数组的使用 8 *(*(p+i)+j) //获取二维数组的每个元素