补充函数
8.1函数的调用
8.1.1值传递
传递顺序自右向左,先传j的值给b,再传i的值给a。
此时输出:10 故在此过程中对实参的修改,并没有影响实参。只传递值,并没有传递变量i,也就是所谓的无法在被调函数中修改主调函数本身。
规则:在调用函数时,不要对同一个实参进行自增或自减的运算。这样不行,在不同编译器的编译的结果不一样。
8.1.2指针传参
8.2 底层编译逻辑
程序:当前静态的概念。
进程:运行的程序是进程。
代码编译时,内存中的过程如下:
注意:pc寄存器只能自增加1。
我们需要引入一个新的概念:
(1)栈 区:来保存当前指令地址(函数调用后要返回的地址),函数定义的局部变量,形参空间。
(2)栈存地址先进后出,后进先出。
(3)pc则是要保护现场,恢复现场
(4)ram中的五个区
实例过程:
栈区存储空间为8mb。故保存现场失败,上述程序运行时会崩。
8.3 递归调用
这就是函数的递归调用,程序运行后会出现下面的情况:
因为无休止的递归调用,会使栈区被装满,程序崩溃。该过程与while死循环不同但很相似。
8.3.1通过递归调用输出累加和
运行过程时,内存栈区的变化如下图所示。同时需要注意,栈区内存有限,故不得一次性累加太多数。
8.3.2 实现阶乘
思想与累加和相似。
8.3.3 斐波拉契数列 输出指定数的前两位数的和
8.3.4汉诺塔
8.4 数组作为参数传递
1.函数的声明中:有const 则可以传数组名和字符。
没有const 则只能传数组名。
2.64位系统中一个地址所占字节为8.
3. 一维数组数组名作为函数参数传递时,应将一维元素数组中的元素个数也一并传递。
4.多维数组的传递,可以省略靠近标识符的下标, 所接受的数组的元素的类型必须固定,但元素
个数是自由的。
拿首元素地址的值来计算其他元素的地址。
相关实例:
int intcmp(int a, int b)
{
if(a > b)
{
return 1;
}
else if(a == b)
{
return 0;
}
else
{
return -1;
}
}
int main(void)
{
int i = 2;
int k;
k = intcmp(i + 1, i);
printf("%d\n", k);
return 0;
}
int add(int a, int b)
{
int ret;
ret = a + b;
return ret;
}
int main(void)
{
int sum;
sum = add(10, 20);
printf("%d\n", sum);
return 0;
}
void f3(void)
{
}
void f2(void)
{
f3();
}
void f1(void)
{
f2();
}
int add(int a, int b)
{
int ret;
ret = a + b;
return ret;
}
int main(void)
{
int i = 10, j = 20;
add(i, j);
puts("Hello World!");
return 0;
}
int fn(int n)
{
if(1 == n)
{
return 1;
}
else
{
return fn(n - 1) * n;
}
}
int fib(int n)
{
if(1 == n || 2 == n)
{
return 1;
}
else
{
return fib(n - 1) + fib(n - 2);
}
}
int main(void)
{
printf("%d\n",fn(6));
return 0;
}
void move(char pole1, char pole2)
{
printf("%c->%c\n", pole1, pole2);
}
void hanoid(int n, char pole1, char pole2, char pole3)
{
if(1 == n)
{
move(pole1, pole3);
}
else
{
hanoid(n - 1, pole1, pole3, pole2);
move(pole1, pole3);
hanoid(n - 1, pole2, pole1, pole3);
}
}
int main(void)
{
hanoid(64, 'A', 'B', 'C');
return 0;
}
void printArray(int a[], int len)
{
int i;
for(i = 0;i < len;++i)
{
printf("%d\n", a[i]);
}
}
int sumOfArray(int a[], int len)
{
int sum = 0;
int i;
for(i = 0;i < len;++i)
{
sum += a[i];
}
return sum;
}
void fn(int a[], int len)
{
int i;
for(i = 0;i < len;++i)
{
a[i] += 10;
}
}
void reverse(int a[], int len)
{
int i;
for(i = 0;i < len / 2;++i)
{
int t = a[i];
a[i] = a[len - i - 1];
a[len - i - 1] = t;
}
}
void choiceSort(int a[], int len)
{
int i, j;
for(i = 0;i < len - 1;++i)
{
for(j = i + 1;j < len;++j)
{
if(a[i] > a[j])
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
}
void bubbleSort(int a[], int len)
{
}
void insertSort(int a[], int len)
{
}
int binaryFind(int a[], int len, int n)
{
int begin = 0;
int end = len - 1;
int mid;
while(begin <= end)
{
mid = (begin + end) / 2;
if(a[mid] > n)
{
end = mid - 1;
}
else if(a[mid] < n)
{
begin = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
int main(void)
{
int a[] = {1,2,3,4,5,6,7,8,9,0, 11,12};
int len = sizeof(a) / sizeof(a[0]);
// sumOfArray(a, len);
choiceSort(a, len);
int ret = binaryFind(a, len, -8);
if(ret < 0)
{
puts("not found");
}
else
{
printf("index = %d, %d\n", ret, a[ret]);
}
// printArray(a, sizeof(a) / sizeof(a[0]));
return 0;
}
void Puts(char s[])
{
int i = 0;
while(s[i] != '\0')
{
putchar(s[i]);
++i;
}
putchar('\n');
}
int Strlen(char s[])
{
int i = 0;
while(s[i])
{
++i;
}
return i;
}
void Strcpy(char dest[], char src[])
{
int i = 0;
while(src[i])
{
dest[i] = src[i];
++i;
}
dest[i] = 0;
}
void Strcat(char dest[], char src[])
{
int i = 0;
while(dest[i])
{
++i;
}
int j = 0;
while(src[j])
{
dest[i++] = src[j++];
}
dest[i] = 0;
}
int Strcmp(char s1[], char s2[])
{
int i = 0;
while(s1[i] == s2[i] && s1[i] && s2[i])
{
++i;
}
return s1[i] - s2[i];
}
int main(void)
{
char s1[100] = "Hello";
char s2[100] = "World!";
// Strcat(s1, s2);
// Puts(s1);
printf("%d\n", Strcmp("ANC", "abc"));
// Puts(s);
return 0;
}
void printArray2D(int a[][4], int rows)
{
int cols = sizeof(a[0]) / sizeof(a[0][0]);
int i, j;
for(i = 0;i < rows;++i)
{
for(j = 0;j < cols;++j)
{
printf("%2d ", a[i][j]);
}
puts("");
}
}
int sumOfArray2D(int a[][4], int rows)
{
int i, j;
int sum = 0;
for(i = 0;i < rows;++i)
{
for(j = 0;j < 4;++j)
{
if(0 == i || 0 == j || rows - 1 == i || 3 == j)
{
sum += a[i][j];
}
}
}
return sum;
}
void reverse(int a[], int len)
{
int i;
for(i = 0;i < len / 2;++i)
{
int t = a[i];
a[i] = a[len - i - 1];
a[len - i - 1] = t;
}
}
void reverse2D(int a[][4], int rows)
{
int i, j;
int cols = sizeof(a[0]) / sizeof(a[0][0]);
for(i = 0;i < rows;++i)
{
reverse(a[i], cols);
/*
for(j = 0;j < cols / 2;++j)
{
int t = a[i][j];
a[i][j] = a[i][cols - j - 1];
a[i][cols - j - 1] = t;
}
*/
}
}
int main(void)
{
int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13};
int rows = sizeof(a) / sizeof(a[0]);
// printf("%d\n", sumOfArray2D(a, rows));
reverse2D(a, rows);
printArray2D(a, rows);
return 0;
}