C++中 指向指针的指针“作用与应用

1 前言

C++中一个指针的使用就已经让很多人欲哭无泪,可是更不幸的是他还有指向指针的指针。指向指针的指针有时候还是非常有用的,我们这节就来介绍一下,指向指针的指针有什么妙用。

2 作用1:在子函数中修改主函数传过来的指针的指向

这是一个最常见的应用,比如:

  • 比如主函数申明一个指针变量,且不为其分配指向空间(只是指向NULL),然后取该指针变量的地址传参给子函数;
  • 在子函数里根据需要申请一片空间;
  • 对传参解引用后得到原来的指针变量,且把该指针变量指向刚才申请的空间(修改了原来指针的指向,这是本质);
  • 从而实现不确定返回值个数的编程方法(这是应用);
    示例1:
#include<stdio.h>
int find(char *s, char src, char **rt)//从s中查询出src字符所在的位置并在rt中返回。
{
	int i = 0;
	while (*(s + i))
	{
		if (*(s + i) == src)//只会出现一次满足条件,此时将此地址给*rt,即p
		{
			* rt = s + i;//这里修改了p的指向
		}
		i++;
	}
	return 0;
 }
 int main(void)
{
   char a[10] = "zhuyujia";
   char *p=NULL;
   find(a, 'y', &p);//改变p的指向,在子函数中实现
   printf("%s", p);
   getchar(); getchar();
   return 0;
}
 /*
//补充:
打印指针的时候,会把指针所指向的内容以及至字符串末位的内容都打印出来
#include<stdio.h>
int main(void)
{
	char a[10] = "abcdefgff";
	char* p = &a[6];
	printf("%s", p);//会打印gff
	getchar(); getchar();
	return 0;
}
*/

示例2:

#include <stdlib.h>
#include <time.h>
#include<stdio.h>
/*当然有必须使用二级指针才能解决的情况,如,某个函数的功能是
返回某个问题的计算结果,但是结果数据是不确定个数的值,所以
在调用此函数时不知道事先应分配多少空间来保存返回的数据,此时
的处理办法就是传递一个没有分配空间的指针的指针(地址)进去,
让函数自己根据计算的结果分配足够的空间来保存结果,并返回,
调用者使用了结果后,由调用者负责内存的释放,即,大家可能听说
过的"谁使用(调用)谁释放"之类的话,如下面的代码:*/
//返回不定结果个数的计算函数
//参数int **pResult  保存返回数据的指针的指针
//参数int &count     保存返回的结果个数
void Compute2(int **pResult, int &count)
{
	//使用随机数来模拟计算结果数的个数
	srand(time(NULL));
	count = rand() % 10;//控制个数在10个以内
 *pResult = new int[count];//*pResult相当于主函数传来的pResult指针,
							  //这里就修改了主函数中的pResult指向,因为还是指针,因此可以指向新开辟的空间
	for (int i = 0; i < count; i++)
	{
		(*pResult)[i] = rand();//给结果随即赋值
	}
} 
//返回不定结果个数的计算函数(此函数不能返回数据)
//参数int *pResult   为保存返回数据的指针
//参数int &count     为保存返回的结果个数
void Compute1(int *pResult, int &count)
{
	//使用随机数来模拟计算结果数的个数
	srand(time(NULL));
	count = rand() % 10;//控制个数在10个以内
	pResult = new int[count];
	for (int i = 0; i < count; i++)
	{
		pResult[i] = rand();//给结果随即赋值
	}
}
int main(void)
{
	int *pResult = NULL;//待获取结果的指针,这里没有分配空间大小,因为不知道返回结果的个数
						//具体返回的个数在在子函数中确定,此时指针pResult指向也改变了
						//这就间接的说明“在子函数中修改主函数传来的指针”的意图
						//具体的应用就在于返回个数不确定的场景,这是后面编程的一个体会点
	int count = 0;//返回结果的个数
				  /*
				  Compute1(pResult,count);//pResult为指针,第二个参数使用引用传递,
				  //使用这个函数时,在函数内部分配的内存的指针并没有返回到主函数中
				  for ( int i = 0 ; i < count ; i++ )
				  printf("第 %d 个结果为 : %d\n",pResult[i]);//执行了Compute1()函数后,pResult的值还是为NULL
				  delete [] pResult;
				  pResult = NULL;
				  */
	Compute2(&pResult, count); //&pResult为指针的地址(即指针的指针),第二个参数使用引用传递
	for (int i = 0; i < count; i++)
		printf("第 %d 个结果为 : %d\n", i, pResult[i]); 
	delete[] pResult;
	pResult = NULL;
	getchar();
	return 0;
}

3 作用2:用指针的指针取二维数组的元素

/*
#include<stdio.h
//错误的做法
int change(char **p)
{
	int i, j;
	for (i = 0; i < 5; i++)
	{
		for (j = 0; *(*(p + i) + j) != '\0'; j++)
		{
			printf("%c", *(*(p + i) + j));
		}
		printf("\n");
	}
	return 0;
}
//若希望赋值,则不能使用指针的指针,要使用数组进行运算。
int change(char p[][10])
{
   int i, j;
   for (i = 0; i < 5; i++)
   {
     for (j = 0; p[i][j] != '\0'; j++)
     {
        p[i][j] = 'c';
        printf("%c", p[i][j]);
     }
     printf("\n");
   }
   return 0;
}
int main(void)
{
	char a[5][10] = { "hello", "zhuyu", "jiajia", "linux","Ubuntu" };
	change(a);
	return 0;
}
*/ 
#include<stdio.h> 
int change(char **p)
{
	int i, j;
	for (i = 0; i < 5; i++)
	{
		for (j = 0; *(*(p + i) + j) != '\0'; j++)//利用指针的指针取二维数组的元素
		{
			*(*(p + i) + j) = 'c';
			printf("%c", *(*(p + i) + j));
		}
		printf("\n");
	}
	return 0;
} 
int main(void)
{
	char a[5][10] = { "hello", "zhuyu", "jiajia", "linux","Ubuntu" };
	char *b[5] = { a[0],a[1],a[2],a[3],a[4] };//这样做读取和写入操作都是可以的。
	change(b);
	return 0;
}

4 作用3:用指针的指针指向指针数组

#include<stdio.h> 
int change(char **p)
{
	int i, j;
	for (i = 0; i < 5; i++)
	{
		for (j = 0; *(*(p + i) + j) != '\0'; j++)//利用指针的指针取二维数组的元素
		{
			*(*(p + i) + j) = 'c';
			printf("%c", *(*(p + i) + j));
		}
		printf("\n");
	}
	return 0;
}
int main(void)
{
	char *a[5] = { "hello", "zhuyu", "jiajia", "linux","Ubuntu" };//如果想使用 需使用指针数组即*a[5] 声明一个有五个字符串指针的数组。
	                                                              //但是由于每个元素都是指针字符串,所以只能够读取,而不能够写入。
	change(a);
	return 0;
}

原文链接:“指向指针的指针”的作用和应用

转载链接:“C++中指向指针的指针的作用

                                </div>
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值