指针
指针是C/C++等编程语言中的一个重要概念,它允许程序员直接操作内存地址。正确地使用指针可以极大地提高程序的效率和灵活性,但不当使用也可能导致程序错误甚至崩溃。简单来说,指针就像是我们上网卖东西填的地址,通过地址可以去到你家找到你。
如何初始化指针
始终初始化你的指针,避免使用未初始化的指针。这可以防止程序因使用无效地址而导致的崩溃。
int *ptr = NULL; // 或 int *ptr = nullptr;
检查分配内存是否成功
在使用malloc()
、calloc()
、realloc()
或new
等函数分配内存后,检查返回的指针是否为NULL
或nullptr
,以确保内存分配成功,否则就会报错。就像快递的地址没设置好,很容易找不到你家。
int *array = (int *)malloc(10 * sizeof(int));
if (array == NULL) {
fprintf(stderr, "Memory allocation failed!\n");
exit(EXIT_FAILURE);
}
这里的"array == NULL"就是判断指针是否设置好的。
避免野指针
野指针是指向不可访问内存区域的指针。确保释放内存之后不再使用该指针,并将其设置为NULL
或nullptr
。这是为了减少占用资源,就像旅店有户人退房了,店主会马上挂空房表示可以入住。
free(array); // 释放内存
array = NULL; // 设置为NULL
同时,当一个指针指向的内存被重新分配或释放时,该指针就变成了悬挂指针。确保在释放内存后及时更新指针。
例子
const int *const ptr = &var; // 指向常量的常量指针
在这行代码中,ptr
是一个指针变量,它指向一个整型变量 var
。这里使用了两次 const
关键字,分别有不同的含义:
-
指向常量的指针 (
const int *
):- 这部分表示
ptr
指向的是一个常量整型数据。 - 意味着通过
ptr
解引用访问的数据不能被修改。 - 例如,你可以这样做:
printf("%d\n", *ptr);
,但是不能这样做:*ptr = 10;
。
- 这部分表示
-
常量指针 (
int *const
):- 这部分表示
ptr
自身是一个常量指针,也就是说ptr
的值(即它所指向的地址)不能被改变。 - 例如,你可以这样做:
printf("%p\n", ptr);
,但是不能这样做:ptr = &someOtherVar;
。
- 这部分表示
当我们把这两部分结合起来时,const int *const ptr = &var;
就表示:
ptr
是一个指针,它指向一个整型常量。ptr
本身也是一个常量指针,其值(即指向的地址)不能被改变。
因此,ptr
既不允许改变它所指向的内容,也不允许改变自身指向的地址。这是一种非常严格的指针定义方式,主要用于保证某些数据的安全性,防止意外修改。