结合http://blog.csdn.net/oqqhutu12345678/article/details/60963087来看。

结合http://blog.csdn.net/oqqhutu12345678/article/details/68489807来看。

(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);//会打印gffgetchar(); 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的值还是为NULLdelete [] 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;
}

(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;
}

(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;
}

“指向指针的指针”的作用和应用相关推荐

  1. [C++] 指向常量的指针 VS 指针类型的常量

    指向常量的指针 VS 指针类型的常量 const 修饰指针时的位置不同,作用也不相同. 1. 指向常量的指针 不能通过指向常量的指针改变所指对象的值,但指针本身可以改变,可以指向另外的对象. 例: i ...

  2. 字符串的指针和指向字符串的指针变量

      引自:http://s319.dlut.edu.cn/educ/83.htm §8.4 字符串的指针和指向字符串的指针变量 8.4.1 字符串的表现形式 在C程序中,可以用两种方法实现一个字符串. ...

  3. C++const 对指针和引用的作用

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105065547 指 ...

  4. C this指针的理解和作用

    C  程序到 C 程序的翻译  要想理解 C 的 this 指针,我们可以先把下面的 C 代码转换成 C 代码: C 语言是没有类定义 class 关键词,但是有跟 class 类似的定义,那就是 s ...

  5. c语言位向量机伞_一文读懂C语言精华-指针变量和指向指针的指针

    1978年贝尔实验室正式发表C语言,受到众多IT从业者的热捧,即使41年过去了,C语言仍然牢牢占据最受欢迎编程语言前二的位置,许多人的程序开发之路也是从C语言开始的. 编程语言受欢迎排名 C语言简洁紧 ...

  6. springboot 对象 空指针_C++ this指针的理解和作用

    C++ 程序到 C 程序的翻译  要想理解 C++ 的 this 指针,我们可以先把下面的 C++ 代码转换成 C 代码:C 语言是没有类定义 class 关键词,但是有跟 class 类似的定义,那 ...

  7. 指针的指针指向指针数组的指针

    一.指针的指针     指针的指针看上去有些令人费解.它们的声明有两个星号.例如:         char ** cp;     如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针 ...

  8. C++ this指针的理解和作用

    微信公众号:「小林coding」 用简洁的方式,分享编程小知识. 01 C++ 程序到 C 程序的翻译 要想理解 C++ 的 this 指针,我们先把下面的 C++ 代码转换成 C 的代码 class ...

  9. 第三节 数组的指针和指向数组的指针变量

    目录 一.指向数组元素的指针变量的定义和赋值 二.通过指针引用数组元素 三.数组名作为函数参数 四.指向多维数组的指针和指针变量探究 五.指针数组和数组指针 一.指向数组元素的指针变量的定义和赋值 数 ...

最新文章

  1. NSight Compute 用户手册(中)
  2. 引用计数(Reference Counting)和代理(Proxy)的应用
  3. 如何利用 nbconvert将 IPYNB文档转换 Markdown文档?
  4. Android查询数据库问题
  5. padarray函数
  6. 不用额外变量交换两个整数的值
  7. ABAP表抛FTP通用程序
  8. 数据:以太坊2.0合约新增8032 ETH
  9. 【Vue2.0】—props 配置(十三)
  10. Lesnoe Ozero 2017. BSUIR Open 2017
  11. Linux下的目录简介
  12. SAP 资产分类的配置方法
  13. Oracle数据库 - 安装教程
  14. 分享一款超好用的 Web SSH 客户端工具
  15. 如何删除itunes中的ipa安装包
  16. testbed笔记:头文件里的函数
  17. 金山数据恢复 2.0
  18. 残差的正态性检验——概率图和QQ-plot图
  19. 知识树沉淀总结-领域驱动设计DDD
  20. Spring(11) - Introductions进行类扩展方法

热门文章

  1. C#实现像微信PC版一样的扫码登录功能
  2. 常用的方法论-NPS
  3. UVA 11383 - Golden Tiger Claw(二分图完美匹配扩展)
  4. linux 特殊shell变量
  5. java中List Set Map使用
  6. Linux(CentOS)挂载NTFS格式的U盘、移动硬盘
  7. 8月12号=》391页-395页
  8. poj2516Minimum Cost
  9. 数据结构排序法之插入法
  10. 大话Fragment管理