c/c++中的字符指针数组以及指向指针的指针

anna_0176 2009-12-30 10:27:28

  char* a[]={"abc","cde","fgh"};//字符指针数组
  char** b = a ;
  cout<<*b<<""<<*(b+1)<<""<<*(b+2)<<endl;


不明白第二行,char *b = a;为什么不对呢?我觉得指针这里我还是没搞明白,望高人讲解一二
...全文
223 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
slowgrace 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 anna_0176 的回复:]
  char* a[]={"abc","cde","fgh"};//字符指针数组  
  char** b= a ;
  cout<<*b<<""<<*(b+1)<<""<<*(b+2)<<endl;

不明白第二行,char *b = a;为什么不对呢?我觉得指针这里我还是没搞明白,望高人讲解一二
[/Quote]

因为a是一个数组标识符,当数组组标识符出现在表达式中,这个标识符的类型就从“某种类型TYPE的数组”转换成一个指针。该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组元素的类型,该指针指向的内存区就是数组第0号单元。

所以,在char** b= a ;这一句里a已经被隐式转换为指向char *的指针,也就是char **。赋值表达式两侧的类型相同,所以语法正确。而如果你把它改成char *b = a;那等号两侧的指针的类型不匹配,就错误了。
anna_0176 2009-12-30
  • 打赏
  • 举报
回复
我自己在琢磨琢磨
traceless 2009-12-30
  • 打赏
  • 举报
回复
类型不匹配当然不对了

a:指向指针的指针
b:指针
pywepe 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 selooloo 的回复:]
先要搞清楚a是什么东西
a是个一维数组,数组元素类型是char *;
可以这样定义
typedef char * Pchar;
Pchar a[]={"abc","cde","fgh"};
Pchar *b;
b=a这样就好理解了

如果是char *b,相当于Pchar b;
b=a显然就不对了,这里a是数组指针,b是数组元素类型
[/Quote]

这个好
以后我就这样写吧
selooloo 2009-12-30
  • 打赏
  • 举报
回复
先要搞清楚a是什么东西
a是个一维数组,数组元素类型是char *;
可以这样定义
typedef char * Pchar;
Pchar a[]={"abc","cde","fgh"};
Pchar *b;
b=a这样就好理解了

如果是char *b,相当于Pchar b;
b=a显然就不对了,这里a是数组指针,b是数组元素类型
ArmStronger 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 anna_0176 的回复:]
看到书里写着,如果把第二行改成char *b = a就不对了,对于这块儿我就不是很理解了
[/Quote]
晕,说的这个问题。。。。
肯定不对的,类型不匹配, a的元素都是char* 类型的
lovesi3344 2009-12-30
  • 打赏
  • 举报
回复
主要是类型不匹配
MS_Frank 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 anna_0176 的回复:]
C/C++ code
  char* a[]={"abc","cde","fgh"};//字符指针数组  char** b= a ;
  cout<<*b<<""<<*(b+1)<<""<<*(b+2)<<endl;

不明白第二行,char *b = a;为什么不对呢?我觉得指针这里我还是没搞明白,望高人讲解一二
[/Quote]

char* a[]相当于char**,即指针的指针
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 anna_0176 的回复:]
看到书里写着,如果把第二行改成char *b = a就不对了,对于这块儿我就不是很理解了
[/Quote]

改成char *b = a肯定不对啊。

b是一维指针,而a是指向char *的数组,数组转成指针,类型也不匹配啊。
anna_0176 2009-12-30
  • 打赏
  • 举报
回复
看到书里写着,如果把第二行改成char *b = a就不对了,对于这块儿我就不是很理解了
ArmStronger 2009-12-30
  • 打赏
  • 举报
回复
lz删掉再重写一遍应该就好了
healer_kx 2009-12-30
  • 打赏
  • 举报
回复
哪里不对?
这不是很好嘛?
ArmStronger 2009-12-30
  • 打赏
  • 举报
回复
vc6通过
char* a[]={"abc","cde","fgh"};//字符指针数组
char** b=a;
cout<<*b<<""<<*(b+1)<<""<<*(b+2)<<endl;
huang_gen 2009-12-30
  • 打赏
  • 举报
回复
在vc 6.0下可以通过呀
taodm 2009-12-30
  • 打赏
  • 举报
回复
找本《C和指针》认真补课。
kiwigiving 2009-12-30
  • 打赏
  • 举报
回复
char* a[]={"abc","cde","fgh"};//字符指针数组
char** b = a ;
cout<<*b<<""<<*(b+1)<<""<<*(b+2)<<endl;

对于 char* a[] 这个表达式,我们首先要明确一点,a是数组类型,它里面的元素类型是 char *,
即字符指针类型。因此 char* a[]={"abc","cde","fgh"} 的意思是:创建三个C字符串临时对象,
分别是:"abc", "cde", "fgh",(注:这三个C字符串对象是由编译器自动创建的),然后让我
们数组a中的第一个字符指针a[0],指向第一个临时对象"abc";第二个字符指针a[1],指向第二个
临时对象"cde",第三个字符指针a[2],指向第三个临时对象"fgh"。

我们知道,数组a,例如 int a[], double a[],等,当我们直接应用数组的名字a时,数组名都直接
转化成指向数组第一个元素的指针,因此,对于 int a[], a表示指向数组第一个元素的指针,而
数组中的元素都是 int 型的,因此a的一个 int * 指针。同理, double a [], a表示指向double
类型的指针,即 double *。 因此类推,便可以知道 char* a[],a是指向 char* 类型的指针,即
a是 char** 类型的。

因此第二个语句是 char **b = a;
slowgrace 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 anna_0176 的回复:]
char** b = a; 相当于 char** b = char** a;
从这个角度来说,我觉得*b可以取到数组的每个值。

但比如说 char** b = a; a指向的是数组的首地址,那么取值用*a,那我认为*b也指的是数组的首地址,这样理解是不是不对呢?
[/Quote]

b(而不是*b)指的是数组的首地址,*b取出了这个首地址所存的元素,a[0]
Thirteen07 2009-12-30
  • 打赏
  • 举报
回复
char* a[]={"abc","cde","fgh"};//字符指针数组
  char** b = a ;
  cout<<*b<<""<<*(b+1)<<""<<*(b+2)<<endl;
楼主的a数组是字符指针数组,也就是说a[0],a[1],a[2]其实也是指针,所以第二条语句是把a[0]的地址赋值给b,如果用char* b = a,那么(*b)的值就是a[0]的值,*(b+1)就会出错,可能会是内存访问出错
sysmaid 2009-12-30
  • 打赏
  • 举报
回复
引用指针,就得用“指向指针的指针”
anna_0176 2009-12-30
  • 打赏
  • 举报
回复
char** b = a; 相当于 char** b = char** a;
从这个角度来说,我觉得*b可以取到数组的每个值。

但比如说 char** b = a; a指向的是数组的首地址,那么取值用*a,那我认为*b也指的是数组的首地址,这样理解是不是不对呢?
加载更多回复(3)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧