C语言指针与动态内存管理详解

需积分: 0 0 下载量 47 浏览量 更新于2024-07-27 收藏 387KB PDF 举报
"这篇资料是C语言的复习第二部分,主要涵盖了指针、数组与指针、动态内存分配以及更多关于文件输入/输出的内容。由Louis TANG博士在2012年秋季授课时提供。" 在C语言中,指针是一个重要的概念,可能对于学习过其他编程语言如Java的人来说并不陌生。Java中只有对象引用,没有原始类型引用,但在C语言中,情况有所不同。C语言提供了地址和指针的概念。指针是一种数据类型,它存储的是内存地址。那么,什么是地址呢?在C语言中,一切都有地址,包括变量、函数和代码。 当声明一个变量如`int i = 10`时,实际上是在内存中分配了4个字节的空间来存储值10。这个地址是计算机内存的一部分,通常在32位系统中,内存地址范围是从0x00000000到0xffffffff,用16进制表示。因此,`int i`会占据这个内存范围内的某个4字节位置。 深入理解指针,我们需要知道如何操作和使用它们。指针变量可以被赋值为其他变量的地址,这样就创建了一个指向该变量的引用。例如: ```c int j = 20; int *ptr; // 声明一个整型指针 ptr = &j; // 将ptr设置为指向j的地址 ``` 通过指针,我们可以间接地修改被指变量的值,或者通过指针调用函数。 接下来,数组和指针密切相关。数组名本质上是一个指向其首元素的指针。这意味着,当我们传递数组名给函数时,实际上是传递了数组的第一个元素的地址。例如: ```c void print_array(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } } int main() { int numbers[] = {1, 2, 3, 4, 5}; print_array(numbers, sizeof(numbers)/sizeof(numbers[0])); // 打印数组 return 0; } ``` 在上述代码中,`print_array`函数接收一个数组名,这相当于接收了数组第一个元素的地址。 动态内存分配是C语言中的另一个重要主题。通过使用`malloc`、`calloc`、`realloc`和`free`等函数,可以在程序运行时动态地请求和释放内存。例如: ```c int *dynamic_arr = malloc(sizeof(int) * 10); // 分配10个整数的空间 if (dynamic_arr == NULL) { // 错误处理:内存分配失败 } else { // 使用动态数组... free(dynamic_arr); // 当不再需要时释放内存 } ``` 最后,文件输入/输出(I/O)是C语言编程中的常见任务。`fopen`、`fclose`、`fprintf`、`fscanf`等函数用于打开、关闭文件以及读写数据。例如,我们可以用以下方式打开一个文件并写入数据: ```c FILE *file = fopen("example.txt", "w"); if (file != NULL) { fprintf(file, "Hello, World!\n"); fclose(file); } else { // 错误处理:无法打开文件 } ``` 这部分内容涵盖了C语言中一些关键的高级概念,理解并熟练掌握这些知识点对于深入学习C语言至关重要。