c语言学习(dyas10)
默认类型与函数传参规则
不显式声明变量类型时,默认视为 int
型。函数参数传递为值传递(复制实参的值给形参),形参修改不影响实参。
示例:值传递的局限性
void modify(int i) { i = 11; }
int main() { int i = 10; modify(i); printf("%d", i); // 输出仍为10
}
需通过传递指针(地址)修改实参值。
函数调用与栈机制
函数调用时,系统通过栈管理执行流程:
入栈:保存主调函数的返回地址、局部变量及形参。
出栈:恢复主调函数现场,继续执行。
栈区限制:Linux 默认栈空间为 8MB,需避免栈溢出。
内存区域划分
堆区:手动申请/释放(如 malloc/free
)。
静态区:存储全局变量和静态变量。
字符串常量区:存放常量字符串。
代码区:编译后的机器指令。
递归调用示例
阶乘计算
int factorial(int n)
{ if(1 == n){return 1;else{ return n * factorial(n - 1); }
}
斐波那契数列
int fibonacci(int n)
{ if(1 == n ||2 == n){return 1;else{ return fibonacci(n - 1) + fibonacci(n - 2); }
}
数组作为函数参数
数组作为参数时,实际传递的是首元素地址。需额外传递数组长度以避免越界。
示例:数组求和
int sum(int arr[], int size)
{ int total = 0; for (int i = 0; i < size; i++){ total += arr[i];} return total;
}
注意:形参 int arr[]
等价于 int *arr
,函数内无法通过 sizeof(arr)
获取数组长度。
传递字符数组指针
字符数组在函数参数中通常以指针形式传递,数组名退化为指向首元素的指针:
int printString(char str[])
{int i;while(s[i]){++i;}return i;
}
注意:字符数组可以不传递长度。
关键注意事项
传参顺序:C 语言函数参数从右向左入栈。
递归风险:深度递归可能导致栈溢出。
指针传递:需修改实参时,传递变量地址(如 &i
),形参为指针类型(如 int *p
)。