C语言 指针
1. 什么是指针?
指针本质上是一个变量,但它的特殊之处在于,它存储的不是一个普通的值,而是另一个变量的内存地址。
2. 如何声明和初始化指针?
声明:
数据类型 *指针变量名;
数据类型
:指这个指针将要指向的变量的数据类型(如int
,char
,float
等)。这决定了指针进行算术运算时的步长。*
:星号是一个类型说明符,表明正在声明的是一个指针。指针变量名
:遵循变量的命名规则。
初始化/赋值:
使用取地址运算符 &
来获取一个变量的地址,并将其赋给指针。
int main() {int num = 10; // 一个普通的整型变量int *p; // 声明一个整型指针 pp = # // 将 num 的地址赋值给指针 p,现在 p“指向”了 num// 也可以在声明的同时初始化int *p2 = #return 0;
}
3. 解引用运算符 (*
)
解引用运算符 *
用于获取或修改指针所指向的内存地址中存储的值。
int main() {int num = 10;int *p = #printf("num 的值: %d\n", num); // 输出:10printf("通过 p 获取的值: %d\n", *p); // 输出:10 (*p 等价于 num)*p = 20; // 通过指针修改它指向的值printf("修改后 num 的值: %d\n", num); // 输出:20return 0;
}
操作 | 代码示例 | 解释 |
---|---|---|
获取地址 | &num | 获取变量 num 的地址 |
声明指针 | int *p; | 声明一个指向 int 的指针 p |
给指针赋值 | p = # | 让指针 p 存储 num 的地址 |
解引用(取值) | value = *p; | 获取 p 指向的那个地址里的值 |
解引用(赋值) | *p = 20; | 向 p 指向的那个地址里写入新值 20 |
4. 指针的主要用途
函数参数传递(按引用传递):
这是指针最重要的用途之一。C语言函数参数默认是“值传递”,即拷贝一份传给函数,函数内部修改不会影响原值。使用指针可以实现“引用传递”,让函数能够修改外部变量的值。// 值传递:无法交换成功 void swap_fail(int a, int b) {int temp = a;a = b;b = temp; }// 指针传递(引用传递):可以成功交换 void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp; }int main() {int x = 5, y = 10;swap_fail(x, y); // x, y 不变swap(&x, &y); // 传递 x 和 y 的地址,x 和 y 的值被成功交换return 0; }
动态内存分配:
C语言使用malloc
,calloc
,realloc
等函数在堆(Heap) 上动态分配内存,这些函数返回的就是指向新分配内存的指针。#include <stdlib.h> int main() {int *arr;int n = 5;// 动态分配可以存放5个int的内存arr = (int*)malloc(n * sizeof(int));if (arr == NULL) {// 处理分配失败}// 使用这个数组...arr[0] = 10; // 像普通数组一样使用// 使用完毕后必须释放内存,防止内存泄漏free(arr);return 0; }