[讨论][数组]是否只有 指针 而无 数组?

cxjddd 2003-10-06 11:50:41
数组真的搞死人啊!

最近我在迷糊了两次之后,终于猜想,实际上在使用数组的过程中,是不存在数组的,只有指针的存在。

比如 int a[10],那么 a 就是 int*,而 &a 是 int (*)[10]。
再如 int a[10][10],a 是 int (*)[10], &a 是 int (*)[10][10];而 a[0] 是 int*,&a[0] 是 int (*)[10]。

http://expert.csdn.net/Expert/topic/2326/2326942.xml?temp=8.251369E-03
再看这样一个问题:
___ // this is the return type
f (int a[][2])
{
return a[1];
}
它的返回值是什么呢?开始我以为是 int[2],但是其实是 int*。

另一个问题是:
new int[4][4],你能得到一个 int (*)[4] 的指针;而 new int[1][4][4],你能得到相同的空间,但是返回值是 int (*)[4][4]。好象声明的数组最后总是要蜕去一层,变成一个指针。

是否只有在定义的时候会出现像 int a[10][10] 这样的东西呢?只有在函数的参数可以达到 int a[][10] 这样的相近,但这只是形式,其实它还是 int (*)[10]。就算在定义的时候有 int a[10][10],a 在使用时还是一个指针。

这是否就是 C/C++ 里数组不能整体引用,而只能通过指针去索引呢?因为实际你能得到的,永远只有指针。
...全文
38 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
earthharp 2003-10-18
  • 打赏
  • 举报
回复
没有所谓的二维
也没有所谓的数组
什么东西都是数字
一切皆是0和1
earthharp 2003-10-18
  • 打赏
  • 举报
回复
class Matrix
{
public:
template <class T>
Matrix(T* array, int row, int col);
};

cxjddd 2003-10-18
  • 打赏
  • 举报
回复
也感觉像 * 和 &。

0_n
deathsky 2003-10-17
  • 打赏
  • 举报
回复
up
sevencat 2003-10-17
  • 打赏
  • 举报
回复
在编译器的那里面,
估计就是一样的东西了。
我现在感觉有点像
*和&的差别了。
TianGuangZao 2003-10-17
  • 打赏
  • 举报
回复
"数组其物理上是一片连续的存储空间"
数组在物理上可不一定连续哦!特别是动态数组。
liem 2003-10-16
  • 打赏
  • 举报
回复
什么是指针?大师们的说法各不相同。但大致可以分为两种:
(1)指针就是地址(实际上是首地址),而存放指针的变量称为指针变量,在不至于混淆的情况下可以简称为指针(否则int *p;读成定义一个存放整型指针的变量,太费事)。
(2)指针是存放地址的变量。

因此讲到数组名是否是指针时,就会有两种不同的说法。

但无论那种说法,数组与指针是不同的东西。
数组其物理上是一片连续的存储空间,而指针却不是。
hamsky 2003-10-16
  • 打赏
  • 举报
回复
上次的回答出现了小错误!
b[2]与a[0][2]的内容是一样的
a[2]是一个变量指针,b[2]是变量

b=a编译会通过的,纠正
cxjddd(战士编程) 2003-10-09 23:25:00 的回答
我觉得楼上中的 steedhorse(晨星)、sharkhuang(什么都不懂,什么都想学!)的理解很透彻,抄下来与大家分享
-----------------------------------------------
steedhorse(晨星) 2003-10-09 23:46:00
相对而言,“数组”是个逻辑概念,而“指针”是个物理概念。
当然,对于“指针”,我也同意把使用“指针变量”和“地址”这两个明确的概念讨论问题,并把他们区分开来。在容易混淆的场合,不要使用“指针”这个摸棱两可的概念。
-----------------------------------------------
sharkhuang(什么都不懂,什么都想学!) 2003-10-10 13:34:00
看见数组我想编译器会把找个数组变量的大小记下来的!

指针不会的!
cxjddd 2003-10-16
  • 打赏
  • 举报
回复
int a[10][10];
int* b=a;

不能通过编译!至少在: GCC3.2 BCC5.5 VC6 VC7.1
cxjddd 2003-10-16
  • 打赏
  • 举报
回复
我想编译器不会找个变量来记录数组的大小。

我想编译器会直接把数组的大小处理成一个常量 inline 的。
ipgk 2003-10-16
  • 打赏
  • 举报
回复
看见数组我想编译器会把找个数组变量的大小记下来的!
----------------------------------------------------
怎么记?记在什么地方了?如果编译器记下了数组大小它为什么不检查数组越界?
编译器只负责在定义数组的时候根据定义给出的大小开辟存储空间,并用数组名去标记这个空间的首地址,之后数组的大小它是不知道的!

___________________________________________________________________________
指针就是地址(实际上是首地址),而存放指针的变量称为指针变量,在不至于混淆的情况下可以简称为指针(否则int *p;读成定义一个存放整型指针的变量,太费事)。
----------------------------------------------------------------------------
这么说,干脆不要指针这个概念好了,存放地址的变量就称为地址变量好了。何必要为地址再找一个代称?
qiume 2003-10-13
  • 打赏
  • 举报
回复
数组名是个指针,这个指针是个指针常量,而一般的(比如: int *p)是指针变量
cuistar 2003-10-13
  • 打赏
  • 举报
回复
我觉得数组是用来便于理解和规范的东西,它实际上应该是一组有规律的数据的指针排列。
samesky 2003-10-13
  • 打赏
  • 举报
回复
愚以为,有些东西讲概念永远也讲不清楚,还是仔细分析些例子,体会一下,可能别听别人说很多遍都管用。呵呵(大家不要吐口水啊!)
ipgk 2003-10-13
  • 打赏
  • 举报
回复
有的人还是不明白。
指针一定是变量?数组名就是指针常量?
建议有上面两个观点的人去认真看看前面的贴子吧。

我也不想再多说了,再举一个例子:
char a[]="123"; //数组
const char * const b="123"; //指针常量
请问两条定义各耗费了多少空间?
第一条定义耗费了:4个字节
第二条定义耗费了:8个字节
为什么?-想想吧。
Wolf0403 2003-10-11
  • 打赏
  • 举报
回复
感觉数组名 VS 指向数组的指针,与那个
引用 VS 指向对象的指针
有着某些相似之处,是吧?^_^
Andy84920 2003-10-11
  • 打赏
  • 举报
回复
去看C专家编程中的解释.很清楚!
努力偷懒 2003-10-11
  • 打赏
  • 举报
回复
感觉越看你们越糊涂了,晕,本来看完了指针这章觉得比较简单的,看你们不知道说到哪里去了,我的见解是:数组的值是定死的,不能改变的,而指针的值能改变,指针就是指针变量,不要老是说指针指针的,应该说指针变量,还有指针的指针变量等等.....用的时候按照各自的规则去用就完了,何必去弄清楚它们哪个是哪个呢?
lyr311 2003-10-11
  • 打赏
  • 举报
回复
觉得“天光早”和“别逗了”说得够全面的
fireinsky 2003-10-11
  • 打赏
  • 举报
回复
指针和数组还是不一样的,不过呢,可以这么说 指针是加了一些限制的数组
对于返回数的函数 编译器会把数组地址转化为指针返回
加载更多回复(41)

69,371

社区成员

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

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