二阶指针和一阶指针实例区分

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stdlib.h>
using namespace std;

void func1(char *s)
{
	s = (char*)malloc(sizeof(char));
	strcpy(s,"hello");
}
///func1() 函数之所以输出empty,没有改变,是传入的参数只是指针变量的一个复制品,并未真正改变
void func2(char **s)
{
   char *r = *s;///让r 和*s指向同一个地方
   r = (char*)malloc(sizeof(char));
   strcpy(r,"hello");///但是现在又让r指向"hello"这个字符串,但是*s仍然指向原来的地方,没有改变*s指向的值
}
///func2() 函数没有改变
void func3(char **s)
{
	*s = (char*)malloc(sizeof(char));
	strcpy(*s,"hello");
}
///func3()改变了*s的值
int main()
{
	char *s = NULL;


	func1(s);
	if(!s)
		cout << "empty" << endl;
	else 
		cout << s << endl;


     func2(&s);
	if(!s)
		cout << "empty" << endl;
	else 
		cout << s << endl;


	func3(&s);
	if(!s)
		cout << "empty" << endl;
	else 
		cout << s << endl;

	return 0;
}

### 三标题:二阶指针的使用方法 在C或C++编程语言中,**二阶指针**(也称为指向指针指针)是种特殊的数据结构,它存储的是另指针的地址。这种结构通常用于处理动态分配的二维数组、字符串数组(如命令行参数)、以及需要修改指针本身的函数参数等场景。 #### 动态分配二维数组 二阶指针可以用来动态分配个二维数组,这在处理矩阵运算或图像数据时非常有用。例如: ```c int **createMatrix(int rows, int cols) { int **matrix = (int **)malloc(rows * sizeof(int *)); for (int i = 0; i < rows; i++) { matrix[i] = (int *)malloc(cols * sizeof(int)); } return matrix; } ``` 上述代码中,`createMatrix` 函数通过 `malloc` 分配了个整型指针数组,每个元素又指向个整型数组,从而创建了个二维数组。需要注意的是,每次调用 `malloc` 后都应该检查返回值是否为 NULL,以防止内存分配失败导致程序崩溃 [^2]。 #### 修改指针本身 当需要在个函数内部修改传入的指针时,可以使用二阶指针作为参数。这样做的原因是,在C语言中,所有参数都是按值传递的,因此如果想要改变指针的值,就必须传递该指针的地址。例如: ```c void changePointer(int **ptr) { *ptr = (int *)malloc(sizeof(int)); **ptr = 10; } ``` 在这个例子中,`changePointer` 函数接收个指向 `int` 类型的指针的地址,并尝试为其分配新的内存空间并赋值。这种方式允许函数修改调用者提供的指针所指向的内容 [^1]。 ### 三标题:注意事项 使用二阶指针时需要注意些常见的陷阱错误,包括但不限于内存泄漏、野指针、以及双重释放等问题。 #### 内存泄漏 每当使用 `malloc` 或 `calloc` 等函数分配内存时,都必须确保最终能够正确地释放这些内存。对于二阶指针来说,这意味着不仅要释放每个子指针指向的内存,还要释放最外层指针本身占用的空间。例如: ```c void freeMatrix(int **matrix, int rows) { for (int i = 0; i < rows; i++) { free(matrix[i]); } free(matrix); } ``` 这里,`freeMatrix` 函数首先遍历并释放了每行的内存,然后才释放了矩阵本身的内存。忽略任何个步骤都可能导致内存泄漏 [^2]。 #### 野指针指针是指那些未初始化或已经释放但仍被使用的指针。在使用二阶指针时,特别是在多次分配释放之后,很容易出现这种情况。为了避免野指针,建议在释放内存后立即将指针设置为 NULL: ```c void safeFree(int **ptr) { if (*ptr != NULL) { free(*ptr); *ptr = NULL; } } ``` 这样,即使后续不小心再次尝试释放同指针,也不会造成严重后果 。 #### 双重释放 双重释放是指尝试释放已经被释放过的内存。这通常会导致未定义行为,可能包括程序崩溃或数据损坏。为了防止这种情况,除了在释放后将指针设为 NULL 外,还应仔细设计代码逻辑,确保每个内存块只被释放次。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值