解释下。。很基础的东西。。

xf_pan 2008-10-14 05:44:00
刚刚看了“给想做C/C++程序员毕业生的一些建议(一)”爆汗。。我有几个也只能是猜,,所以发帖,,听听大虾们的高见。。
现有char a[10][20],下面表达式各代表的意义:a, a+1, a[1]+1, *a[1], *a, &a[1][1], &a[1]。
...全文
161 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2008-10-15
  • 打赏
  • 举报
回复
还是下本《C与指针》来个一揽子解决吧。
jackylea 2008-10-15
  • 打赏
  • 举报
回复
顶下来回去看看
xf_pan 2008-10-15
  • 打赏
  • 举报
回复
to 16楼。。
你的解释太正确了。。
xf_pan 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 JYYCOM 的回复:]
引用 19 楼 taodm 的回复:
还是下本《C与指针》来个一揽子解决吧。

那是相当的经典啊
[/Quote]
有好的电子版推荐马?
JYYCOM 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 taodm 的回复:]
还是下本《C与指针》来个一揽子解决吧。
[/Quote]
那是相当的经典啊
xf_pan 2008-10-15
  • 打赏
  • 举报
回复
数组和指针还有很多东西得努力啊。。。。。。。。
kiffa 2008-10-14
  • 打赏
  • 举报
回复
为了不出现歧义,假设数组是从第0个元素开始的,即a[0][0]是第0个元素;同样有第0行,第0列。

char a[10][20];

名称 类型 说明
a: 数组 数组名,其值为数组第0个元素的地址。

a + 1: char(*)[20] 指向数组的指针,其值为数组第1行的首地址。

a[1] + 1: char * 字符指针,指向a[1][1],其值为a[1][1]的地址。

*a[1]: char 等价于*(a[1] + 0),即a[1][0];

*a: char * 等价于*(a + 0),即a[0],也即&a[0][0];

&a[1][1]: char * a[1][1]地址,即 a[1] + 1。

&a[1]: char(*)[20] 指向数组的指针,等价于a + 1,其值为其值为数组第1行的首地址。

&a: char(*)[10][20] 指向二维数组的指针,其值为数组第0个元素的地址,
long(&a + 2) - long(&a + 1) = sizeof(char) * (10 * 20),
即整个数组所占的字节大小。
xf_pan 2008-10-14
  • 打赏
  • 举报
回复
从上面的测试程序发现过规律,,(以前没有看到过,看到过的大虾们不要BS俺)
数组在省略下标时,会自动向右补一位下标[0],然后把数值加在补的这位下标上。
比如 a[3][3] ={1,2,3,4,5,6,7,8,9};
a 代表 a[0], 这很好理解
cout<<a;
cout<<*a;相等了,,*a == *a[0],,a[0] 是二维数组的第一维的首地址,,*a是第一维第一个元素的首地址,,注意这里概念上有区别,,虽然都是同一个地址。。

a+1= a[0]+1 = a[1][0];
a[1]+1 = a[1][0]+1=a[1][1];
*a[1]=*a[1][0];
*a=*a[0];
&a[1][1];
&a[1]=&a[1][0];

以上是我在VS2005下实际测出来的。。没有测过别的,,不知道不同编译器结果会怎样。。
期待能有gcc,dev++下的结果。。
帅得不敢出门 2008-10-14
  • 打赏
  • 举报
回复
如果是值相等的话 不代码指向的东西是一样的
可能是一个char空间
但是也有可能是char[]的空间
小猴饲养员 2008-10-14
  • 打赏
  • 举报
回复
a: 数组a[10][10]第一个元素即a[0][0]的地址
a+1: a[0][1] 的地址
a[1]+1: a[2]的地址
*a[1]: a[1][0] 的值
*a: a[0][0]的值
&a[1][1]: a[1][1]的地址
&a[1]: a[1][0]的地址
太乙 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xf_pan 的回复:]
引用 3 楼 hqin6 的回复:
C/C++ code晕,不是有人问过了么?chara[10][20],
a,数组指针,指向第一个元素!
a+1,数组指针,指向第一行元素的第0个元素
a[1]+1, 指向第一行第一个元素*a[1], 先于[1]结合,a[1]指向第第一行第0个元素,*可以拿到第一行第0个元素的值*a, 第0行第0个元素&a[1][1], 第一行第一个元素的值&a[1]。//第一行的首地址,也就是a[1][0]的地址@


我在VS2005下。。测了下,发现。a 和*a都是数组的首…
[/Quote]

不一样,虽然指向的地址确实一样!

*a+1//这就是第0行移动一个元素,也就是a[0][1]
*(a+1)//折就是第一行第0个元素!移动一行!!

a是行指针,+1就是移动一行

*a是元素指针,+1就是移动一个元素



xf_pan 2008-10-14
  • 打赏
  • 举报
回复
以上是我侧出的结果。。
等待大家贴砖。。

以下是测试程序:
我用的是INT型。。效果一样。。

#include <iostream>
using std::cout;
using std::endl;
int main(void)
{
int a[3][3] = {1,2,3,4,5,6};
int n = sizeof(int);
n = sizeof(a[1]);
cout<<"a:"<<a<<" "<<"a+1:"<<a+1<<" "<<"a[1]+1:"<<a[1]+1<<endl;
cout<<"*a[1]:"<<*a[1]<<" "<<"*a:"<<*a<<" "<<"&a[1][1]:"<<&a[1][1]<<" "<<"&a[1]:"<<&a[1]<<endl;

cout <<endl<<endl;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
cout<<"&a["<<i<<"]["<<j<<"]:"<<&a[i][j]<<" ";
cout<<endl;
}
getchar();
return 0;
}

太乙 2008-10-14
  • 打赏
  • 举报
回复


char a[2][2]={'m','n','p','q'};

a//指向首地址,如果cout<<*a,那么就是从a的首地址输出,*a是一个地址!
a+1//指向p那个元素的地址,如果cout<<*(a+1),就是从p开始输出
*a//指向第0行地址

----------------------------------------
上面都是指向的地址
----------------------------------------






a[1]+1//指向a[1][1]元素
a[1]//可以看做是a[1]+0,指向a[1][0]


*a+1//这就是第0行移动一个元素,也就是a[0][1]
*(a+1)//折就是第一行第0个元素!移动一行!!
------------------------------
上面都是指向的元素
------------------------------


后面几个取地址就不用说了!
chenzhp 2008-10-14
  • 打赏
  • 举报
回复
int main()
{

char a[10][20];
printf("%ld\n",(long)a);
printf("%ld\n",(long)(a+1));
printf("%ld\n",(long)(a[1]+1));

printf("%ld\n",(long)(&a[1][1]));
printf("%ld\n",(long)(&a[1]));
}



1244856
1244876 //a+1 的结果,说明是首地址增加了一个第二维的长度 20
1244877
1244877
1244876
Press any key to continue
xf_pan 2008-10-14
  • 打赏
  • 举报
回复
a+1
相当于 a[0]+1
指向了。。第二行,,第一个。。
xf_pan 2008-10-14
  • 打赏
  • 举报
回复
a[1]+1, 指向第一行第一个元素

相当于 a[1][0] +1 指向了第二行。。第二个。
boys2002 2008-10-14
  • 打赏
  • 举报
回复
现有char a[10][20],下面表达式各代表的意义:a, a+1, a[1]+1, *a[1], *a, &a[1][1], &a[1]。


我来试下 :


a 数组指针,指向第一个元素!
a+1 数组指针,指向第一行元素的第1个元素
a[1]+1 指向第1行第1个元素
*a[1] 先于[1]结合,a[1]指向第第一行第0个元素,*可以拿到第一行第0个元素的值
*a 第0行第0个元素
&a[1][1] 第一行第一个元素的值
&a[1] 第一行的首地址,也就是a[1][0]的地址~~~~~~~~~~~~~~~~~~~~~~~~
xf_pan 2008-10-14
  • 打赏
  • 举报
回复
&a[1][1], 第一行第一个元素的值,

是地址把。。
xf_pan 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hqin6 的回复:]
C/C++ code晕,不是有人问过了么?chara[10][20],
a,数组指针,指向第一个元素!
a+1,数组指针,指向第一行元素的第0个元素
a[1]+1, 指向第一行第一个元素*a[1], 先于[1]结合,a[1]指向第第一行第0个元素,*可以拿到第一行第0个元素的值*a, 第0行第0个元素&a[1][1], 第一行第一个元素的值&a[1]。//第一行的首地址,也就是a[1][0]的地址@
[/Quote]

我在VS2005下。。测了下,发现。a 和*a都是数组的首的地址。。是二维数组的原因吧。。
太乙 2008-10-14
  • 打赏
  • 举报
回复
晕,不是有人问过了么?

char a[10][20],
a,数组指针,指向第一个元素!
a+1,数组指针,指向第一行元素的第0个元素
a[1]+1, 指向第一行第一个元素
*a[1], 先于[1]结合,a[1]指向第第一行第0个元素,*可以拿到第一行第0个元素的值
*a, 第0行第0个元素
&a[1][1], 第一行第一个元素的值
&a[1]。//第一行的首地址,也就是a[1][0]的地址@
加载更多回复(2)
一、C语言自我YY1)、C语言是许多高级计算机语言的基础,学好C语言能更好的学习其他高级语言,为以后的学习打基础;往深学C语言的话那就是学到C在Linux里的应用,Linux十分强大。2)、C语言是一种计算机程序设计语言。具有高级语言的特点,又具有汇编语言的特点。C语言可作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。3)、应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。具体应用比如单片机以及嵌入式系统开发。4)、C语言是面向过程语言,C语言通过windows/linux平台下编译的,是直接运行在windows/linux平台下的,而XX始终是运行在他的虚拟机之上的;所以理论上C语言能做一些相对于比较底层的工作,像XX就不能编写Windows病毒。5)、如果要利用编程来做一些windows优化工作的话,建议还是利用C语言。C语言是目前世界上流行、使用最广泛的高级程序设计语言6、很多编译器,几乎所有操作系统Windows,Linux,Unix的大部分代码都是C,C在背后做了很多东西的,也许开发游戏用C++,安卓用XX更为合适,图形界面的用其他语言开发效率更高一些(因为他们封装了很多东西),但同样的原因导致略微接近底层的功能其他语言根本干不了!Windows的API都是按照C语言的格式给的,这也很能说明问题!嵌入式开发更是离不了C语言!纵观电脑发展几十年,C语无所不能呀!

64,691

社区成员

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

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