程序的调试实质上就是观察程序运行的中间结果。
函数可以视为一个可以被重复使用的代码片段;之所以有函数:1.可以避免频繁的复制粘贴代码。2.简化了代码的逻辑,方便程序员来理解代码。
函数的分类:1.自定义函数 2.库函数(不用自己写的函数) 标准库函数(strlen、scanf、system、printf......)。 系统库函数(sleep) 第三方库函数(数量更加庞大)
函数调用的时候,形参是实参的一份拷贝~ 实参ab和形参xy没有任何的关系(唯一的联系就是形参xy创建的时候是通过ab来初始化的)。
*x和a是完全等价的。通过解引用操作/间接访问操作
根据指针中的地址,找到对应的内存空间。
//1.如果是素数返回1,不是返回0
//int isprime(int num) {
// if (num == 0) {
// return 0;
// }
// if (num == 1) {
// return 0;
// }
// for (int i = 2; i <= num; i++) {
// if (num % i == 0) {
// return 0;
// }
// else {
// return 1;
// }
// }
// }
//2.是闰年返回1,不是闰年返回-1
//int isyear(int year) {
// if ((year % 4 == 0 && year % 100 == 0) || (year % 400 ==0)) {
// return 1;
// }
// else {
// return -1;
// }
//}
//3.写一个函数,实现一个整形有序数组的二分查找。
//int isSearch(int arr[], int size, int toFind) {
// int left = 0;
// int right = size - 1;
// int mid = (left + right) / 2;
// if (arr[mid] < toFind) {
// //放弃查找左边
// left = mid + 1;
// }
// else if (arr[mid] > toFind) {
// //放弃查找右边
// right = mid - 1;
// }
// else {
// return mid;
// //找到了
// }
//}
//4. 写一个函数,每调用一次这个函数,就会将num的值增加1。
void add(int* p) {
*p += 1;
}
int main() {
int num = 0;
add(&num);
printf("%dn", num);
//printf("%dn", isSearch(100,56,1));
//printf("%dn", isyear(2000));
//printf("%dn", isprime(4));
#include <>与#include ""的区别:#include <>是在系统目录中查找头文件;#include ""是在当前项目所在的目录中查找头文件
#pragma once 在定义头文件的时候需要加上这个指令,防止一个头文件被多次调用(多次调用是没有必要的,反而会增加编译的开销)
函数调用其他函数就是嵌套调用。函数自己调用自己就是递归。
递归的代码看起来没有多少,但是执行过程特别复杂。递归的代码人脑分析起来特别困难。
void printNum(unsigned int num) {
if (num >= 10) {
printNum(num / 10);
}
printf("%d ",num % 10);
}
int main() {
printNum(1234);
int mystrlen2(char* str) {
if (str[0] == ' ') {
return 0;
}
return mystrlen2(str + 1) + 1;
}
int main() {
printf("%dn",mystrlen2("abcd"));
求字符串长度、求阶乘...既可以用循环来实现也可以用递归来实现~~ 其实从理论上讲,循环和递归完全是等价的。任何一个递归程序都能转为循环,反之,任何一个循环程序也可以转成递归。



