C语言指针详解:定义、操作与空指针

需积分: 3 0 下载量 61 浏览量 更新于2024-08-04 收藏 330KB PDF 举报
"C语言指针小结" C语言中的指针是其强大的特性之一,它允许直接操作内存地址,增强了程序的灵活性和效率。以下是对指针的详细讲解: 1. **指针与内存地址**:每个变量在内存中都有一个特定的位置,这个位置被称为变量的地址,可以通过`&`运算符获取。例如,`int var_runoob = 10;`声明了一个整型变量`var_runoob`,它的地址可以由`&var_runoob`获得。 2. **指针类型匹配**:在C语言中,不同类型的指针不能混淆使用。`int *p`声明了一个指向整型变量的指针,它不能直接用来初始化一个整型变量,如`int x = &var_runoob;`这样的代码是错误的。 3. **指针的本质**:指针本质上是一个存储内存地址的变量。`int *p`声明了一个指针变量`p`,它可以存储`int`类型变量的地址。在`p = &var_runoob;`之后,`p`就指向了`var_runoob`的内存地址。 4. **指针操作**: - 定义指针变量:`int *ip;` - 给指针变量赋值:`ip = &var;` 这里将`var`的地址赋给指针`ip`。 - 访问指针指向的值:`*ip` 通过解引用操作符`*`,我们可以得到`ip`所指向的变量的值,即`var`的值。 5. **NULL指针**:在C语言中,NULL指针是一个特殊的指针值,通常用`NULL`或`0`表示。在声明指针变量时将其初始化为NULL是一个好习惯,如`int *ptr = NULL;`。NULL指针表示指针没有指向任何有效的内存地址。 6. **指针算术运算**:指针可以进行加减运算,每次操作会移动到相应类型变量的下一个或前一个存储单元。例如,对于`int`类型的指针,每次递增或递减相当于移动4个字节(在大多数系统中,`int`占4个字节)。`ptr++`会使得`ptr`指向当前`ptr`所指的`int`变量的下一个位置。 7. **数组与指针**:在C语言中,数组名实际上是一个指向数组首元素的指针。因此,对数组下标的操作实际上是在对指针进行加减运算。例如,`int arr[5]`声明了一个包含5个整数的数组,`arr + 1`则指向数组的第二个元素。 8. **函数参数与指针**:指针常用于函数参数,允许函数直接修改实参变量的值。例如,`void modify(int *num) { *num = 20; }`,调用`modify(&var)`会改变`var`的值。 9. **动态内存分配与指针**:通过`malloc()`或`calloc()`函数,可以动态地在堆上分配内存,并返回一个指向新分配内存的指针。例如,`int *dp = (int *)malloc(sizeof(int) * 10);`分配了10个`int`大小的内存块。 10. **指针数组与数组指针**:指针数组是一组指针,每个指针可以指向不同的数据。而数组指针是一个指针,它指向一个数组的起始地址。两者在使用时需注意区分。 了解并熟练掌握指针是成为C语言高手的关键,它能帮助我们编写出更高效、灵活的代码,但同时也需要谨慎操作,避免出现未初始化的指针或者悬挂指针等问题。