1.传值调用和传址调用;
#include<stdio.h>
//交换函数
//形参是实参的临时拷贝,对形参的影响不会改变实参
//传值调用
//void swap(int x, int y)
//{
// int tmp = 0;
// tmp = x;
// x = y;
// y = tmp;
//}
//
//int main()
//{
// int a = 0;
// int b = 0;
//
// scanf("%d %d", &a, &b);
// printf("交换前a=%d,b=%d\n", a, b);
// swap(a,b);
// printf("交换后a=%d,b=%d\n", a, b);
// return 0;
//}
//
//
//
//可以用指针地址来改变,传址调用。
//void swap(int* x, int* y)
//{
// int tmp = 0;
// tmp = *x;
// *x = *y;
// *y = tmp;
//}
//
//int main()
//{
// int a = 0;
// int b = 0;
//
// scanf("%d %d", &a, &b);
// printf("交换前a=%d,b=%d\n", a, b);
// swap(&a, &b);
// printf("交换后a=%d,b=%d\n", a, b);
// return 0;
//}
第一个交换前后不发生变化,因为形参是实参的一份临时拷贝,对形参的改变不会影响实参
2.函数的递归
递归的两个必要条件 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
每次递归调用之后越来越接近这个限制条件。
问题 递归函数 打印1234中的每一位
//递归函数 打印1234中的每一位
//1234
void print(int n)
{
if (n > 9) /*至少为2位数*/
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
unsigned int i = 0;
scanf("%d", &i);
print(i);
return 0;
画图来解释
输入123,进入print函数,判断123>9,下面print(n/10),值为12,再进入print,12>9进入下面,值为1,走到最下面,判断失败因为1<9,直接printf(1%10)为1,然后再上去到print的位置,12/10为2,2%10为2,再上去123可以取出3,最后可以打印出1,2,3
掌握递归思想,一些递归的题在gittee里面地址https://gitee.com/yu-ge-studies-hard/daima.c
3.写一个函数,实现一个整形有序数组的二分查找。
int is_search(int arr[], int i, int sz)
//{
// int left = 0;
// int right = sz - 1;
//
// while (left <= right)
// {
// int mid = left + (right - left) / 2;
// if (arr[mid] > i)
// {
// right = mid - 1;
// }
// else if (arr[mid] < i)
// {
// left = mid + 1;
// }
// else
// return mid;
// }
// return -1;
//}
//
//int main()
//{
// int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//
// int i = 0;
//
// scanf("%d", &i);
//
// int sz = sizeof(arr) / sizeof(arr[0]);
//
// int ret = is_search(arr, i, sz);
//
// if (ret == -1)
// {
// printf("找不到");
// }
// else
// {
// printf("找到了,下标是:%d\n",ret);
// }
//
// return 0;
//}
这里面有一个sizeof不能放在函数里面,函数里面不能用sizeof,sizeof(arr) 求的不是整个数组,求的是首元素的大小,会被看成是指针大小。
4.递归和非递归分别实现strlen
递归实现
int my_strlen(char* str)
{
if (*str != '\0')
return 1 + my_strlen(str + 1);
}
int main()
{
char arr[] = "abcd";
int ret = my_strlen(arr);
printf("%d ", ret);
return 0;
}
my_strlen("abcdef")
1 + my_strlen("bcdef")
1+1+my_strlen( "cdef" )
1+1+1+ my_strlen( "def")
1+1+1+1+ my_strlen( "ef")
1 +1 +1 + 1 +1+my_strlen( "f")
1 + 1 + 1 + 1 + 1 + 1 + my_strlen("")
str是地址,*str是解引用找到的是a的值,首元素地址
str是a的地址,str+1找到的是b的地址
非递归
int my_strlen(char* str)
{
int c = 0;
while (*str != '\0')
{
str++;
c++;
}
return c;
}
int main()
{
char arr[] = "abcde";
int ret = my_strlen(arr);
printf("%d ", ret);
return 0;
}