双重指针问题!!!
#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));这条语句,哪位大神说下这里为什么要用到指向指针的指针!!! 展开
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));这条语句,哪位大神说下这里为什么要用到指向指针的指针!!! 展开
4个回答
展开全部
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] 才是字符串的首地址值!
从这个定义可以看出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中!
展开全部
首先你要明白二级指针变量 是干什么用的,是存放 一级指针变量的地址.
举个简单例子:
假如有如下定义:
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如上示意图依此类推
举个简单例子:
假如有如下定义:
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如上示意图依此类推
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先,解释一下,printf("%s", p) ; 语句中的p是char * 类型 或者是char p[] 类型 ;
char *name[] = .... 中name为一个数组名,该数组中的元素为char* 类型 ;
char **p_name = name ;这里name会被转换成指针,代表数组的首地址,数组中的元素为指针类型,所以此刻name自然而然就是指向指针的指针,也就是说*name 的值为一个指针。
一句话,因为数组里面存放的是指针,char**p_name 存放的是字符串指针的地址,只有把地址中的元素取出来才符合输出格式的要求。
char *name[] = .... 中name为一个数组名,该数组中的元素为char* 类型 ;
char **p_name = name ;这里name会被转换成指针,代表数组的首地址,数组中的元素为指针类型,所以此刻name自然而然就是指向指针的指针,也就是说*name 的值为一个指针。
一句话,因为数组里面存放的是指针,char**p_name 存放的是字符串指针的地址,只有把地址中的元素取出来才符合输出格式的要求。
追问
字符串指针为什么按%s输出?
追答
这个是函数的调用约定,就好比int 类型大多数情况下占四个字节一样的道理。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这种代码纯属故弄玄虚,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效果是一样的。
首先,"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效果是一样的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询