C语言里二级指针的意思是指向指针的指针,一级指针就是普通的指针,一个二级指针一定是对应着一个一级指针,那么二级指针和这个它对应的一级指针之间有什么秘密呢?

1. 首先明白在二级指针使用中 ++*pptr 与 *pptr++ 之间的区别

首先申明一下,这里的pptr和标题中的一样,都代表着指向指针的指针,是一个二级指针,所以用了两个'p'来表示嘛。接下来看下面的代码:

int main(int argc, char ** argv)
{char * ar[5] = {"ruby", "java", "c++", "python", "js"};//定义一个含5个指针元素的指针数组 char ** pptr = ar;//定义一个二级指针,并初始化为ar printf("pptr = %p\n", pptr);printf("*pptr = %p\n", *pptr);printf("++*pptr = %p\n", ++*pptr);
}

程序的输出是:

第一行输出都明白,第二行第三行地址却仅仅加了1,说明第三行是"ruby"中u的地址。

那么换成*pptr++呢?

程序的输出是:

我们发现,地址并没有加1,那是因为在*pptr++中,pptr先和++结合,但是它所代表的是自增之前的地址,再用*运算符获取到一个它对应的一级指针,所以打印出来的地址并没有改变。而在++*pptr中,pptr先和*运算符结合,得到它所对应的一级指针,再对这个一级指针++,且是自增之后的地址,所得到的地址自然是加了1。

注意:*pptr++虽然地址没有变,但是它仍然是递增的,增了多少?实际上增的是二级指针,所以结果是404005。


2. 重点:深入++*pptr

先看下面一段代码:

int main(int argc, char ** argv)
{char * ar[5] = {"ruby", "java", "c++", "python", "js"};//定义一个含5个指针元素的指针数组 char ** pptr = ar;//定义一个二级指针,并初始化为ar char ** pptr_t = ar;//复制一份pptr printf("*++*pptr = %c\n", *++*pptr);printf("**pptr_t = %c\n", **pptr_t);
}

输出是多少呢?

有人的答案是:*++*pptr = u, **pptr_t = r

很遗憾,答案是错的,不过答对了一半,*++*pptr = u 是正确的,那么**pptr_t又是多少呢?

肯定会有人疑问,pptr_t不是和pptr开始都一样吗,都是指针数组ar首元素的地址,pptr_t又没有进行别的操作,**pptr_t的值不应该仍然是r吗?

然而正确答案是:*++*pptr = u, **pptr_t = u !

原因在于:++*pptr操作已经将pptr对应的那个一级指针*pptr自增了,直接改变了指针数组中第一个指针元素,它指向的不再是r而是u,当下一次访问这个一级指针上的值时,即**pptr_t的值就是改变后的u了!


3. 应用:在处理命令行参数时遇到的问题

有些操作系统,包括UNIX和MS-DOS,让用户在命令行中编写参数来启动一个程序的执行。当在处理命令行参数时,有些程序允许用户在一个参数中放入多个选项字母,例如下面的一个命令行:

prog -abc name1 name2 name3

-abc是将-a,-b,-c三种选项字母结合在一起,同样拥有三种选项。这交由下面的一段代码来处理:

while (( opt = *++*argv) != '\0')
{switch (opt){case 'a':option_a = TRUE;break;/*etc. */ }
}

可以看到,程序中运用了++*argv,所以我们要注意的是,使用这种方式 ,命令行参数可能只能处理一次,因为指向参数的指针在内层循环中被破坏,如果多次处理参数,当你挨个访问列表时,对每个需要增值的指针都做一份拷贝。


C中二级指针与它指向的一级指针之间的秘密(深入++*pptr)相关推荐

  1. 指针笔记(指针数组和指向数组的指针,数组中a和a的区别等)

    指针数组和指向数组的指针 int *p[4]和int (*p)[4]有何区别? 前者是一个指针数组,数组大小为4,每一个元素都是一个指向int的指针 后者是指向int[4]类型数组的指针 以上代码若运 ...

  2. (转)函数指针,指针函数,指向函数的指针,返回指针的函数

    摘要: 在学习C语言时,一个比较容易混淆的概念就是函数指针.指针函数.返回值为指针的函数.本文将对这三个概念进行区分.指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同.函数指针就是一 ...

  3. 常量指针、指针常量以及指向常量的指针常量

    三个名词虽然非常绕嘴,不过说的非常准确.用中国话的语义分析就可以很方便地把三个概念区分开.  一)常量指针. 常量是形容词,指针是名词,以指针为中心的一个偏正结构短语.这样看,常量指针本质是指针,常量 ...

  4. C++ 指向子类的指针转型为指向父类类型指针之后指向的对象地址不变

    C++ 指向子类的指针转型为指向父类类型指针之后指向的对象地址不变 例子: class A{int a;int b; };class B:public A{int c; };int main(){B* ...

  5. C和指针之指针数组和指向数组的指针

    1.指针数组 定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续再定义 int *p[10]; 2.指向数组的指针 定义一个数组指针,该指针指向含10个元素的一维数组(数组 ...

  6. c语言handler指针,typedef与指向函数的指针结合的妙用

    今天看到keil的一个例子,里面涉及到利用typedef和指向函数的指针结合的例子,使得程序结构体系非常明了,觉得很好,特地记下来. 首先在头文件定义了这个指针,并用typedef将其声明为一个类型: ...

  7. C语言基础——指针数组(指向数组的指针)

    数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存.定义数组时,一定要给出数组名,数组名可 ...

  8. 指针常量 和 指向常量的指针区别

    指针常量 说明这个指针是常量,是不可以修改的 如 有一个数组 char ch[5]="list";//用5位是因为 默认有一个0放在最低位 char * const pstr = ...

  9. c语言数组数据用指针查找,c语言数组与指针_指针篇_2011.ppt

    c语言数组与指针_指针篇_2011 指 针 6.2 指针的概念6.3 指针与数组6.4 字符串的指针6.5 指针数组和指向指针的指针;6.2.1 地址与指针的概念 ;指针的概念;内存地址;2.数组与地 ...

最新文章

  1. SNMP introduction
  2. R语言dataframe合并函数merge实战
  3. oracle 11g rac手册(第2版) 高清,Oracle Database11g RAC手册(第2版)_IT教程网
  4. poj3114Countries in War(缩点+DIJK)
  5. G6 2.0 开源发布 -- 裂变·聚变
  6. zz测试接口_使用FizzBu​​zz和JUnitParams进行单元测试
  7. C++\Python\Qt工作笔记-读取txt文件查找某行是否包含keyWord
  8. python书籍推荐1001python书籍推荐_Python的1001种骚操作——基础篇(0)
  9. android 资料
  10. java aix_如何在AIX下安装JAVA
  11. RT thread 设备驱动组件之USART设备
  12. VHDL半整数与奇数分频器设计实验
  13. 计算机设计贺卡教案,《运用Word制作电子贺卡》教学设计
  14. 神秘病毒现形 网购当心黑客“点杀”
  15. Socket编程与应用开发---- 数据采集的设计与实现(TCP)
  16. iOS 图片涂鸦功能
  17. 继FCoin后的下一轮浪潮 —— 去中心化交易所的逆风翻盘
  18. 自己动手,丰衣足食------Rust实现自己的Stream
  19. 微信小程序通过省市区获取经纬度
  20. 【元宇宙系列】初识元宇宙(Mateverse)

热门文章

  1. PPT卡死了?只需要这几个小技巧,瞬间帮你提速!
  2. 如何在Nintendo 64控制器上更换磨损的模拟棒
  3. 微软与网景与浏览器之争
  4. 抖音之xl xa xg xk 四神签名参数
  5. 统计学名词解释 —— 2. 什么是「总体」和「样本」
  6. 二代测序技术之illumina测序技术原理简介
  7. linux 进程调度cfg,选择Linux I / O调度程序
  8. c语言地震子波6,地震子波显示及合成地震记录
  9. CPAL脚本自动化测试 ———— Flexray系列函数及使用
  10. kafka启动报错:kafka.common.InconsistentClusterIdException: The Cluster ID KtS-r0FATSudTYqgf-7Ifw doesn‘t