双重指针问题!!!

#include<stdio.h>intmain(void){char*name[]={"China","Beijing","Longmai"};char**p_name... #include <stdio.h>
int main(void)
{
char *name[]={"China","Beijing","Longmai"};
char **p_name;
int i;
p_name=name;
for(i=0;i<3;i++)
{
printf("%s",*(p_name+i));
}
printf("\n");
return 0;
}

不理解 printf("%s",*(p_name+i));这条语句,哪位大神说下这里为什么要用到指向指针的指针!!!
展开
 我来答
kaixingui2012
2012-10-22 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6171万
展开全部
char *name[] ;
从这个定义可以看出name是个数组,数组名本身就是一个静态的地址(不可变)
数组元素是char *类型,即name[i]也是个地址。
所以,如果要用另一个变量来遍历这个数组,就需要定义一个二维指针。
char **p_name; 定义二维指针
p_name=name; 将name的值(数组首地址)存入p_name
相当于p_name=&name[0] ;
即:
p_name+0中存的是name[0]的地址值
p_name+1跳过一个指针的空间(四个字节),其中存的是name[1]的地址值
前面说了,name[i]也是个地址,所以*(p_name+1)相当于 name[1] 才是字符串的首地址值!
追问
也就是说China,Beijing,Longmai 都是地址吗?
追答
严格说 “China”,“Beijing”,“Longmai”都是字符串常量,字符串常量可以看作是地址(指针)!
即:char *p="hello" ; 意思就是将p指向"hello"所在的地址。 换句话说:"hello"所在的地址值存在了p中!
yiqiu2324
2012-10-22 · TA获得超过632个赞
知道小有建树答主
回答量:117
采纳率:100%
帮助的人:87.2万
展开全部
首先你要明白二级指针变量 是干什么用的,是存放 一级指针变量的地址.
举个简单例子:
假如有如下定义:
int a=3,*p=&a,**p2=&p;
printf("%d %d",*p,**p);//结果相同 3,3
/*
p2-----> p-------->a
&p &a 3
*/
看这个例子(这个例子为了演示二级指针用法):
p_name=name;//等价于p_name=&name[0];

p_name-->name[0] --> China\0
p_name+1-->name[1] --> Beijing\0
p_name+2-->name[2]--> Longmai\0
这里再举个例子说明下%s使用法:
char *p="China"//p指向字符串常量China,p中存放的为首字符的地址
printf("%d",p);//编译器会输出第一个字符,接着p+1,输出第二个,直到遇到'\0'为止

printf("%s",*(p_name+i));// 完全等价于printf("%s",name[i])

第一次*p_name的值为name(指针数组名),name又代表&name[0]因此输出name[0]指向的字符串
第二次*p_name+1如上示意图依此类推
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
XIaOMoMo__
2012-10-22 · TA获得超过141个赞
知道小有建树答主
回答量:97
采纳率:0%
帮助的人:71.1万
展开全部
首先,解释一下,printf("%s", p) ; 语句中的p是char * 类型 或者是char p[] 类型 ;
char *name[] = .... 中name为一个数组名,该数组中的元素为char* 类型 ;
char **p_name = name ;这里name会被转换成指针,代表数组的首地址,数组中的元素为指针类型,所以此刻name自然而然就是指向指针的指针,也就是说*name 的值为一个指针。
一句话,因为数组里面存放的是指针,char**p_name 存放的是字符串指针的地址,只有把地址中的元素取出来才符合输出格式的要求。
追问
字符串指针为什么按%s输出?
追答
这个是函数的调用约定,就好比int 类型大多数情况下占四个字节一样的道理。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
burkwen
2012-10-23 · TA获得超过2522个赞
知道大有可为答主
回答量:1104
采纳率:100%
帮助的人:647万
展开全部
这种代码纯属故弄玄虚,p_name根本没必要用,当然作为习题帮助你理解概念是好的。

首先,"China","Beijing","Longmai"这三个,叫字符串常量,它们是有值的,值就是各自首字符的地址,可以赋给一个char*。所以 char *name[]={"China","Beijing","Longmai"}这句可以换成
char *name[]={地址1,地址2,地址3},然后这样解释:name是一个数组,这个数组有3个元素,每个元素是一个char*,其中name[0]=地址1,name[1]=地址2,name[2]=地址3。

这样就清楚了,name是什么?是数组名,也就是name[0]的地址。name[0]是什么?它的值是一个char的地址,所以它是一个char型指针。推理下来,name是一个char型指针的地址,那么把name赋给一个变量,即令p_name=name,那么变量p_name是什么?只能是char型的双重指针,因为他的值是一个char型指针的地址,即,他指向一个char型指针。

p_name指向头一个char型指针,就是name[0]喽,那么p_name+1就是指向下一个char*,也就是name[1]。那么*(p_name+1)就是name[1]了。类推。
为什么说p_name多余,直接用name代替p_name效果是一样的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式