(1)知识点
(1)return只能返回一个值,不能返回两个 例如:return a,b;这是错误的写法。
(2)数组名本来就是地址
(3)函数的形式参数和实际参数可以同名
(4)函数主调函数和被调函数可以不在一个文件夹 #include ".h那个函数名"
(5)函数设计应该追求高内聚低耦合(函数的独立相对来说比较高)
(6)函数要尽可能的少使用全局变量,参数也不宜过多
(7)内存空间包括栈区(储存局部变量、临时参数等 出程序时就被回收释放 用一会儿就不用了就被销毁了 )、堆区(动态内存分配的)、静态区(静态变量static、全局变量)。所以函数的形式参数在栈中保存。
(2)函数返回两个变量
代码展示:
1. #include <stdio.h> 2. void test(int arr[]) 3. { 4. arr[0] = 10; 5. arr[1] = 20; 6. } 7. int main() 8. { 9. int arr[2] = { 0 }; 10. test(arr); 11. printf("%d %d", arr[0], arr[1]); 12. return 0; 13. }
(1)数组名本来就是地址(2)数组传参,传的是首元素的地址,避免空间浪费
(3)打印100-200之内的素数
代码展示:
1. #include <stdio.h> 2. int sushu(int n) 3. { 4. int j = 0; 5. for (j = 2; j < n; j++) 6. { 7. if (n % j == 0) 8. return 0; 9. } 10. if (j == n) 11. return 1; 12. } 13. int main() 14. { 15. int i = 0; 16. for (i = 100; i <= 200; i++) 17. { 18. if (sushu(i) == 1) 19. printf("%d", i); 20. else 21. continue; 22. } 23. return 0; 24. }
优化代码展示:
1. #include <stdio.h> 2. #include <math.h> 3. int is_prime(int n) 4. { 5. int j = 0; 6. for (j = 2; j <= sqrt(n); j++) 7. { 8. if (n % j == 0) 9. { 10. return 0; 11. } 12. } 13. return 1; 14. } 15. int main() 16. { 17. int i = 0; 18. for (i = 100; i < 201; i++) 19. { 20. if (is_prime(i) == 1) 21. { 22. printf("%d ", i); 23. } 24. } 25. return 0; 26. }
注意比较这两个函数,学习一下更加简练的写法
(4)实现一个函数打印乘法口诀表,行数由自己指定
1. #include <stdio.h> 2. void chengfa(int n) 3. { 4. int i = 0; 5. int j = 0; 6. for (i = 1; i <= n; i++) 7. { 8. for (j = 1; j <= i; j++) 9. { 10. printf("%d*%d=%-2d ", i, j, i * j); 11. } 12. printf("\n"); 13. } 14. } 15. int main() 16. { 17. int line = 0; 18. scanf("%d", &line); 19. chengfa(line); 20. return 0; 21. }
(5)用函数实现字符串逆序,不能使用C函数库中的字符串操作函数(对称的字符交换)
代码1展示:(用数组的方法)
1. #include <stdio.h> 2. int my_strlen(char* s) 3. { 4. int count = 0; 5. while (*s != '\0') 6. { 7. count++; 8. s++; 9. } 10. return count; 11. } 12. void reverse_str(char arr[]) 13. { 14. int left = 0; 15. int right = my_strlen(arr) - 1; 16. while (left < right) 17. { 18. char a = arr[left]; 19. arr[left] = arr[right]; 20. arr[right] = a; 21. left++; 22. right--; 23. } 24. } 25. int main() 26. { 27. char arr[] = "abcdefg"; 28. reverse_str(arr); 29. printf("%s", arr); 30. return 0; 31. }
代码展示:(用指针的方法)
1. 2. #include <stdio.h> 3. int my_strlen(char* s) 4. { 5. int count = 0; 6. while (*s != '\0') 7. { 8. count++; 9. s++; 10. } 11. return count; 12. } 13. void reverse_str(char* a) 14. { 15. char* left = a; 16. char* right = a + my_strlen(a) - 1; 17. while (left < right) 18. { 19. char b = *left; 20. *left = *right; 21. *right = b; 22. left++; 23. right--; 24. } 25. } 26. int main() 27. { 28. char arr[] = "abcdefg"; 29. reverse_str(arr); 30. printf("%s", arr); 31. return 0; 32. }
代码展示:(用递归的方法)
1. #include <stdio.h> 2. int my_strlen(char* s) 3. { 4. int count = 0; 5. while (*s != '\0') 6. { 7. count++; 8. s++; 9. } 10. return count; 11. } 12. void reverse_str(char* a) 13. { 14. int b = my_strlen(a); 15. char c = *a; 16. *a = *(a + b - 1); 17. *(a + b - 1) = '\0'; 18. if (my_strlen(a + 1) > 1) 19. reverse_str(a + 1); 20. *(a + b - 1) = c; 21. 22. } 23. int main() 24. { 25. char arr[] = "abcdefg"; 26. reverse_str(arr); 27. printf("%s", arr); 28. return 0; 29. }
这个代码比较难以理解,就是首元素与末元素交换以后,再把末元素换成'\0' ,递归回归的时候,再把末元素一个一个的换成首元素。
(6)求一个数字 每位数之和
写一个递归函数,输入一个非负整数,返回成它的数字之和。
代码展示:
1. #include <stdio.h> 2. int DigitSum(size_t n) 3. { 4. if (n < 9) 5. return n; 6. else 7. return DigitSum(n / 10) + n % 10; 8. } 9. int main() 10. { 11. size_t n = 0; 12. scanf("%u", &n); 13. int ret = DigitSum(n); 14. printf("%d", ret); 15. return 0; 16. }
非负整数 size_t %u