Linux C编程:const指针与函数详解

需积分: 0 0 下载量 133 浏览量 更新于2024-08-26 收藏 6KB TXT 举报
实参是两个不同的作用域,互不影响。 一、const修饰的指针 在C语言中,`const`关键字用于修饰变量,表示该变量的值不应被程序修改。当`const`修饰指针时,有两种情况: 1. 指向常量的指针:`const int *p` 表示指针`p`所指向的内容是不可变的,但指针`p`本身的地址可以改变,也就是说你可以将`p`指向其他变量。例如,如果`p`最初指向`a`,你不能通过`*p`来改变`a`的值,但可以重新赋值`p`使其指向其他变量。 2. 指针常量:`int *const p` 表示指针`p`本身是常量,它的地址不可改变,即`p`一旦指向某个地址,就不能再改变。但是,可以通过`p`访问的内存空间内的值是可以修改的,如果`p`指向`a`,则可以通过`*p`来改变`a`的值。 二、函数 函数是C语言中实现模块化编程的重要手段。函数可以分为库函数和自定义函数: - 库函数:由标准库或第三方库提供的函数,如`printf()`、`scanf()`等,可以直接调用而无需编写函数体。 - 自定义函数:根据需求编写的函数,用于实现特定功能。 函数定义的一般形式如下: ```c 返回值类型 函数名(参数类型 参数名1, 参数类型 参数名2, ...) { 函数体; return 返回值; // 返回值类型应与函数声明保持一致 } ``` 在调用函数时,需注意以下几点: - 形参列表的类型和顺序必须与函数定义中的形参列表完全匹配。 - 实参的值会被复制到形参中,形参和实参在内存中是分开的,修改形参不会影响实参的值,除非使用指针或引用。 三、函数声明 函数声明告诉编译器函数的名称、返回类型和参数列表,以便在调用函数之前编译器能进行类型检查。函数声明通常放在函数定义之前,例如: ```c 返回值类型 函数名(参数类型, ...); ``` 四、指针作为参数传参 在函数中,使用指针作为参数可以实现对原变量的直接修改。当指针作为参数传递时,实际传递的是指针的地址,而非它所指向的值。因此,函数内部可以通过指针修改其指向的变量,如: ```c void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int x = 10, y = 20; swap(&x, &y); // x和y的值会交换 ``` 五、一维和二维数组的传参 在C语言中,数组名实际上是指向数组首元素的指针。因此,传递一维数组的参数就像传递普通指针一样。而对于二维数组,由于它实际上是数组的数组,传递时通常传递行指针,例如: ```c void printArray(int arr[3][4]) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } int main() { int matrix[3][4] = { /* 初始化 */ }; printArray(matrix); return 0; } ``` 六、函数指针 函数指针是一个指向函数的指针,可以用来作为参数传递给其他函数,或者作为其他函数的返回值。例如: ```c void printInt(int num) { printf("%d\n", num); } void callFunction(void (*func)(int), int value) { func(value); } int main() { callFunction(printInt, 100); return 0; } ``` 七、指针函数 指针函数是指返回指针的函数,可以用来动态分配内存或返回结构体的指针等。例如: ```c int *getIntPtr() { int *ptr = (int *)malloc(sizeof(int)); *ptr = 42; return ptr; } int main() { int *myPtr = getIntPtr(); printf("%d\n", *myPtr); free(myPtr); return 0; } ``` 八、递归函数 递归函数是一种在其定义中调用自身的函数。递归通常用于解决分治问题,如阶乘计算、树遍历等。例如,计算阶乘的递归函数: ```c int factorial(int n) { if (n == 0 || n == 1) { return 1; } else { return n * factorial(n - 1); } } int main() { printf("%d\n", factorial(5)); // 输出 120 return 0; } ``` 九、main函数传参 `main`函数可以接收命令行参数,这些参数在`main`函数中以`char *argv[]`的形式存在。`argv[0]`通常是程序名,`argv[1]`及其后的元素是用户在命令行中输入的参数。例如: ```c int main(int argc, char *argv[]) { if (argc > 1) { printf("Received argument: %s\n", argv[1]); } return 0; } ``` 在命令行运行`./program arg1 arg2`,程序会输出`Received argument: arg1`。