指针的指针

转载 2008年10月02日 17:02:00

一个指针变量可以指向整型变量、实型变量、字符类型变量,当然也可以指向指针类型变量。当这种指针变量用于指向指针类型变量时,我们称之为指向指针的指针变量,这话可能会感到有些绕口,但你想到一个指针变量的地址就是指向该变量的指针时;这种双重指针的含义就容易理解了。下面用一些图来描述这种双重指针,见图6-13。
1x-22.gif
在图中,整型变量i的地址是&i,将其传递给指针变量p,则p指向i;实型变量j的地址是&j,将其传递给指针变量p,则p指向j;字符型变量ch的地址是&ch,将其传递给指针变量p,则p指向ch;整型变量x的地址是&x,将其传递给指针变量p2,则p2指向x,p2是指针变量,同
时,将p2的地址&p2传递给p1,则p1指向p2。这里的p1就是我们谈到的指向指针变量的指针变量,即指针的指针。
指向指针的指针变量定义如下:
类型标识符**指针变量名
例如:float**ptr;
其含义为定义一个指针变量ptr,它指向另一个指针变量(该指针变量又指向一个实型变量)。由于指针运算符“*”是自右至左结合,所以上述定义相当于:
float*(*ptr);
下面看一下指向指针变量的指针变量怎样正确引用。
[例6-27]用指向指针的指针变量访问一维和二维数组。
#include<stdio.h>
#include<stdlib.h>
main()
{
int a[10],b[3][4],*p1,*p2,**p3,i,j;/是*p指3向指针的指针变量*/
for(i=0;i<10;i++)
scanf("%d",&a[i]);/*一维数组的输入*/
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&b[i][j]);/*二维数组输入*/
for(p1=a,p3=&p1,i=0;i<10;i++)
printf("%4d",*(*p3+i));/*用指向指针的指针变量输出一维数组*/
printf("/n");
for(p1=a;p1-a<10;p1++)/*用指向指针的指针变量输出一维数组*/
{
p3=&p1;
printf("%4d",**p3);
}
printf("/n");
for(i=0;i<3;i++)/*用指向指针的指针变量输出二维数组*/
{
p2=b[i];
p3=&p2;
for(j=0;j<4;j++)
printf("%4d",*(*p3+j));
printf("/n");
}
for(i=0;i<3;i++)/*用指向指针的指针变量输出二维数组*/
{
p2=b[i];
for(p2=b[i];p2-b[i]<4;p2++)
{
p3=&p2;
printf("%4d",**p3);
}
printf("/n");
}
}
程序的存储示意如图6-14所示,对一维数组a来说,若把数组的首地址即数组名赋给指针变量p1,p1就指向数组a,数组的各元素用p1表示为,*(p1+i),也可以简化为*p1+i表示。
如果继续作将p3=&p1,则将p1的地址传递给指针变量p3,*p3就是p1。用p3来表示一维数组的各元素,只需要将用p1表示的数组元素*(p1+i)中的p1换成*p3即可,表示为*(*p3+i)。
1x-23.gif
同样,对二维数组b来说,b[i]表示第i行首地址,将其传递给指针变量p2,使其指向该行。
该行的元素用p2表示为*(p2+i)。若作p3=&p2,则表示p3指向p2,用p3表示的二维数组第i行元素为:*(*p3+i)。这与程序中的表示完全相同。
运行程序:
1x-24.gif
[例6-28]利用指向指针的指针变量对二维字符数组的访问。
#include<stdio.h>
#include<stdlib.h>
main()
{
int i;
staticcharc[][16]={"clanguage","fox","computer","homepage"};
/*二维字符数组*/
static char *cp[]={c[0],c[1],c[2],c[3]};指/*针数组*/
static char **cpp;/*指向字符指针的指针变量*/
cpp=cp;/*将指针数组的首地址传递给指向字符指针的指针变量*/
for(i=0;i<4;i++)/*按行输出字符串*/
printf("%s/n",*cpp++);
printf("-----------/n");
for(i=0;i<4;i++)/*按行输出字符串*/
{
cpp=&cp[i];
printf("%s/n",*cpp);
}
}
1x-25.gif
程序中需要注意的是,执行cpp=cp是将指针数组的首地址传递给双重指针,所以*(cpp+i)表示第i行的首地址,而不是cpp+i。在程序设计时一定分清。

OC之【指向指针的指针】

#import void changeC(char *d) {     *d = 9; } void changeStr(NSString **str2) {  ...
  • superchaoxian
  • superchaoxian
  • 2013年12月01日 19:51
  • 2319

什么时候用指针的指针 **

比如声明u32 **buf 这个buf要作为一个函数的参数,这个函数的作用是告诉bufni
  • fengyunjh6
  • fengyunjh6
  • 2014年08月22日 10:17
  • 931

“指向指针的指针”的作用和应用

使用目的: (1)在子函数中修改主函数传过来的指针的指向(主要目的) 明显的例子: #include int find(char *s, char src, char **rt)//从s中查询出sr...
  • oqqHuTu12345678
  • oqqHuTu12345678
  • 2017年03月09日 16:10
  • 238

指向指针的指针的内存分配与释放

原文地址::http://hi.baidu.com/b_a_i_du/blog/item/7125a7d35ca0afd6a8ec9af6.html?   相关网帖    1.给指向指针的指针分...
  • xqhrs232
  • xqhrs232
  • 2012年06月02日 09:42
  • 1347

C++实例:指向指针的指针的初始化

int **ptr = new int*[N];   for ( i = 0; i   ptr[i] = new int[N];   #include   #include ...
  • yang1994
  • yang1994
  • 2012年02月29日 17:09
  • 1668

指向指针的指针变量有什么用

最佳答案 我给楼主一个最直接的理由:那就是如果你希望在一个函数的参数中改变一个指针的值,你就只能传这个指针的指针给这个函数。 比如有int *p; 而你想在函数f中对其增量,就只好: ...
  • nadakiss
  • nadakiss
  • 2011年03月08日 12:00
  • 2168

如何理解指向指针的指针?

问题:如何理解指向指针的指针? 我在一篇教程中看到下面这段,它描述指向指针的指针是如何运作的。 引用文章相关段落如下: int i = 5, j = 6, k = 7; int *ip1 = &...
  • jb19900111
  • jb19900111
  • 2014年03月04日 11:00
  • 1351

函数参数中指向指针的指针

指向指针的指针
  • markjenny
  • markjenny
  • 2015年06月11日 15:35
  • 343

链表添加函数中为什么要用指向链表指针的指针

在看书的时候有个函数往链表里添加节点,代码中考虑到可能给出的头指针为空,并做另外一些处理。具体代码如下: #include #include using namespace std; str...
  • shen_jz2012
  • shen_jz2012
  • 2016年02月03日 22:41
  • 4246

【C语言】指向指针的指针 char * *使用技巧

需求: 因为需要定义一个字符串数组,用来存放多个字符串,于是想到使用 char **这种结构——指向指针的指针,于是编写代码如下: #include #include int main() ...
  • chenglibin1988
  • chenglibin1988
  • 2013年03月30日 20:52
  • 14183
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指针的指针
举报原因:
原因补充:

(最多只允许输入30个字)