有没有人解释一下这个程序?

r137477991 2011-09-17 02:33:10

#include <stdio.h>
char *a[1] = {"C++"};
void main()
{
printf("%c\n", a[0][1]);
}

为什么定义的指针数组是一维的,却可以用a[0][1]输出?
...全文
183 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fenliuheliu 的回复:]
*()号运算符和[]运算符可以互换的,比如*(p+i)就相当于p[i],理解了这个,应该你就能理解你的程序了。
[/Quote]
事实的确如此。
yousun4688 2011-09-17
  • 打赏
  • 举报
回复
定义了一个字符型的指针数组,指针数组被负值,输出的是a[1]
r137477991 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 modicum_lf 的回复:]
首先 a 是指针数组 !包含两个元素 指针a[0],和指针a[1]。。

a[0]指向"C++",
a[0][1]也就是a[0]这个指针指向的字符串"C++"的第一个元素!

C语言数组是以0开始的!
所以输出的应该是字符 '+' .
[/Quote]
a是指针数组,只有一个元素a[0]。。。
hexd21 2011-09-17
  • 打赏
  • 举报
回复
6#给力,只要理解c里面的字符串就是按照字符数组来处理的就ok了!
yht8708 2011-09-17
  • 打赏
  • 举报
回复
其实就一指针数组 这么麻烦……
wangcftxz 2011-09-17
  • 打赏
  • 举报
回复
其实指针和数组在某些地方可以互换的
char *a[1] = {"C++"};
可以理解为定义了一个a[0][4]={'C','+','+','\0'}的数组
hancker 2011-09-17
  • 打赏
  • 举报
回复
指针数组
缺媳妇的郝 2011-09-17
  • 打赏
  • 举报
回复
话说我终于不是一个问题看不懂了,上面解释已然很给力了,我再补充下:
char a[];和const char *a;基本没区别。所以你可以把char *a[];看成char a[][];
modicum_lf 2011-09-17
  • 打赏
  • 举报
回复

首先 a 是指针数组 !包含两个元素 指针a[0],和指针a[1]。。

a[0]指向"C++",
a[0][1]也就是a[0]这个指针指向的字符串"C++"的第一个元素!

C语言数组是以0开始的!
所以输出的应该是字符 '+' .

紫冰枫 2011-09-17
  • 打赏
  • 举报
回复
一楼精辟,6楼详细,楼上的解析都是同一回事。。。给力了
xialeijie368 2011-09-17
  • 打赏
  • 举报
回复
++[Quote=引用 1 楼 mstlq 的回复:]
对比下面的,楼主明白了吗?
C/C++ code

#include <stdio.h>
char *a = "C++";
void main()
{
printf("%c\n", a[1]);
}
[/Quote]
守猪待屠 2011-09-17
  • 打赏
  • 举报
回复
char *a[1] = {"C++"};
含义:定义了一个数组,a[1],里头共一个值。即:a[0],而a[0]的值是"C++",既是'C++'这一字符串,而一个字符串就是char数组;所以这里a[1]是2维数组。
同理,char *a[10] = {"C++"};定义了一个数组,a[10],10个值,a[0]= "C++",a[1] = a[2] = ... default值,因为这个括号里头就一个“C++”,如果char*a[10] = {"C++", "D++"}这样,a[0] = "C++",a[1] = "D++", a[2] = a[3] = ...=default值。
a[0]a[1]:其中a[0]表示“C++”这一字符串的首地址。而a[1]表示的是“C++”这一字符串的第二个,即:“+”。所以,a[0]a[1]输出一个"+"
综上,其中一个概念,本人默认LZ是知道的:字符串 的概念。
浮生如梦VIP 2011-09-17
  • 打赏
  • 举报
回复
*()号运算符和[]运算符可以互换的,比如*(p+i)就相当于p[i],理解了这个,应该你就能理解你的程序了。
geochway 2011-09-17
  • 打赏
  • 举报
回复
a是一个字符指针的数组,可能这样写会更容易理解:

char *p1="B++",*p2="BC++";
char *a[3]={"C++",p1,p2};

这样就不难理解a[0]="B++"; a[1]=p1="B++";
a[0][1]也就不难理解了。
飞天御剑流 2011-09-17
  • 打赏
  • 举报
回复
下标运算符所要求的操作数并非数组,而是指针,下标表达式a[b]会被替换为等价形式*( a + b ),由于a[0]的结果是char*,因此a[0][1]其实是* ( char* + 1 ),就是一个char*指针加了1后再解引用而已。
jixingzhong 2011-09-17
  • 打赏
  • 举报
回复
*a[1],和a[1]是有区别的。

指针本身也也可以通过[]访问元素。
wizard_tiger 2011-09-17
  • 打赏
  • 举报
回复
a[n]是向后移n位取值,相当于*(a+n)。
mstlq 2011-09-17
  • 打赏
  • 举报
回复

对比下面的,楼主明白了吗?

#include <stdio.h>
char *a = "C++";
void main()
{
printf("%c\n", a[1]);
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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