Chinaunix

标题: 严重声明:C语言中不存在数组的类型!它仅仅是一个概念! [打印本页]

作者: unistd    时间: 2009-12-19 20:14
标题: 严重声明:C语言中不存在数组的类型!它仅仅是一个概念!
在以他一些高级语言中,大都存在一种数组的类型,,该类型包含了若干元素,还有元素个数等其它属性。这些数组类型的对象是被当作一个整体来对待的。。。

但是在C中,可以说,不存在这种高级语言的数组类型,,C中的数组,仅仅是地址排列在一起的元素而已,不管是char、int还是复杂的struct数组,,仅仅是排列在一起的该类型大小的内存而已。数组的下标引用,仅仅是指针偏移的一种易读的形式!也可以说,数组在C中只是一个名字,简称而已。

如果你定义了一堆类型相同的变量,比如int a, b, c, d, e, f, .....只要它们编译后的内存地址是连续的,那么你也可以用数组的方式使用它们:

int *p = &a;
p[0] = 1; //a
p[1] = 2; //b
p[3] = 3; //c
......

我觉得,在考虑C语言的任何问题的时候,都必须在大脑中画出一个内存空间来,,你所有的变量、函数什么的,都排列在这些空间上,然后,一切就都容易理解了。。。。

所以说,那个关于数组名能不能减1的帖子,根本没有必要讨论那么多页,,数组名仅仅是一个指针而已,它的类型为数组的元素类型的指针,,只是通常这个指针指向第一个元素,而且为常量而已!

对编译器来说,任何类型的指针,仅仅是指向的内存大小不同,其它都按照相同的对待! 所以数组名减一,就好比一个指针减一效果一样。

大家别忘了,,C语言之前还是汇编和机器语言,,丹尼斯瑞奇它们不可能从汇编时代一下子就设计到21世纪计算机发展水瓶,所以C的很多设计,其实就是汇编语言的设计
在汇编中也存在一种字符串拷贝命令MOVSB,把首地址放入一个寄存器(好像是SI),然后把数量放入另一个寄存器(好像是CX),随后是目的地址寄存器(好像是DI),
可以看出,汇编语言中的字符串拷贝命令和C中的数组命令是类似的,就是要求地址连续!

从汇编、机器、硬件的角度思考C语言的问题,才是正确地道路。。而且几十年来,到了今天,计算机仍然是几十年前的体系结构,就算出来更多的java/net,  C的这种工作方式仍然是有效的,,这是当代计算机软件的基础!

====================

看了下面的回复有人有不同意见,最典型的就是数组和指针sizeof的结果不同。。。
其实这很好理解,,,数组名和指针,仅仅是一个标识符而已,一个标识符在可以认为是代表了不同的位置(地址),sizeof不是一个函数,而是一个运算符,该晕算符由编译器实现,编译器在解析C语句的时候,已经知道了整个数组的大小,所以它会给出数组的大小,而不只指针的大小。。。
我们说的数组名是不是指针,仅仅是在编写代码这一层,因为一旦编译之后,这些名字都会成为中间文件(*.o)里的符号而已,会失去其含有的类型信息,因为这些类型信息已经用完了,被编译器转化为偏移量、地址等等。。。这些已经是我们写代码的领域之外了。。。
所以从编写代码的角度来看,把数组名当作常量指针没有任何问题。

=====================
有必要再次声明一下,C语言中不仅不存在数组类型,也不存在char, short, int, long, float, double等等这些类型,非要说C存在一种类型,那也可以说只有一种类型:内存段。何为内存段?就是一块内存,暂时称为raw_piece.
为什么说C是一种无类型或者弱类型的语言?因为我们的计算机对待内存就是无类型的。
高级语言中的类型,可以在运行时取得该类型对象的属性,比如长度、元素个数等等,因为这些属性保存在了对象本身内部。
在C中,我们可以用struct来构造类似高级语言的这种数据类型。
在面向对象的高级语言中,一直无法完美的统一类类型 (class)和内置类型(整形,浮点型等),只好采取打包(box)和解包(unbox)等特殊方法来在必要时把内置类型封装成类类型,在不需要时再还原回来。。。
其实这有必要吗?我们有必要定义那么多复杂的类型规则吗?我们的语言,应该像C, 就一种类型:raw_piece,你想要什么样的类型,都可以从raw_piece构造出来。比如raw_piece(1)当作字符型,raw_piece(4)当作整形,raw_piece(sizeof(struct.....))当作复杂类型。。。。当然,函数库可以预先构造一些经常用到的类型,以方便使用。
我们的编程语言应该简洁,我们的世界应该简单,整个宇宙说不定只有一个定理。。爱因斯坦晚年曾经想把宇宙中的4种力(强力、弱力、电磁力和万有引力)统一成一种,这就是一种追求简单的境界。
我认为C语言还是过于复杂,C99中引入的一些现代特性根本没有必要,完全可以通过重新定义C的某些特性,通过修改库函数的定义,在不改变语言接口得情况下来满足现代需要
C需要的是一个更多功能的函数库,,只需把现在高级语言种常用的类型、特性、功得能等也纳入C的标准库,那就完全可以取代当今大部分新的语言。C是通过库函数来扩展其功能的,这个设计理念相当优秀!


[ 本帖最后由 unistd 于 2009-12-21 12:06 编辑 ]
作者: prolj    时间: 2009-12-19 20:23
lz正在学习C语言?
作者: flw    时间: 2009-12-19 20:25
C 是有数组的……
作者: system888net    时间: 2009-12-19 20:27
原帖由 unistd 于 2009-12-19 20:14 发表
C中的数组,仅仅是地址排列在一起的元素而已,不管是char、int还是复杂的struct数组,,仅仅是排列在一起的该类型大小的内存而已。数组的下标引用,仅仅是指针偏移的一种易读的形式!也可以说,数组在C中只是一个名字,简称而已。


有见解!
作者: gtkmm    时间: 2009-12-19 20:32
char a[100];
char *b;

如果a,b类型相同,必有
sizeof( a) == size( b),是吧。
作者: c/unix    时间: 2009-12-19 20:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: unistd    时间: 2009-12-19 20:34
原帖由 gtkmm 于 2009-12-19 20:32 发表
char a[100];
char *b;

如果a,b类型相同,必有
sizeof( a) == size( b),是吧。


a和b仅仅是在编码、编译阶段的一个符号,在最终的可执行代码中是不存在的。
把组sizeof之后得到数组的大小,只能说是C语言的一个特殊规定而已,我要是设计C语言的话,就不会做这个特殊规定,所有符号、指针,一律返回该平台地址空间的字节大小

[ 本帖最后由 unistd 于 2009-12-21 12:09 编辑 ]
作者: zhaohongjian000    时间: 2009-12-19 20:35
7楼彻底亮了
作者: zhaohongjian000    时间: 2009-12-19 20:36
C语言的数组名不是指针,说它代表一个地址更准确些。

sizeof数组名的时候可以得到数组大小
作者: system888net    时间: 2009-12-19 20:38
原帖由 gtkmm 于 2009-12-19 20:32 发表
char a[100];
char *b;

如果a,b类型相同,必有
sizeof( a) == size( b),是吧。


这个反问比较牛!
作者: reiase    时间: 2009-12-19 20:38

  1. int foo(int a[100]);
复制代码


作者: system888net    时间: 2009-12-19 20:41

又是不同角度的概念之争.
作者: 群雄逐鹿中原    时间: 2009-12-19 20:42
原帖由 unistd 于 2009-12-19 20:34 发表


把字符串数组sizeof之后得到字符串的大小,只能说是C语言的一个特殊规定而已,我要是设计C语言的话,就不会做这个特殊规定,所有指针,一律返回该平台地址空间的字节大小



你要能回答我一个问题

struct A
{
    int b;
    int a[100];
    int c;
}

sizeof(A) 和 sizeof(a) 如何达到和谐?
作者: system888net    时间: 2009-12-19 20:45

lz的"C语言中不存在数组的类型"这句话,如果不结合lz的全文,很容易被大家误解lz要表达的意思!单就这句话而言,很容易举出反证的.
作者: gtkmm    时间: 2009-12-19 20:45
原帖由 unistd 于 2009-12-19 20:34 发表


把字符串数组sizeof之后得到字符串的大小,只能说是C语言的一个特殊规定而已,我要是设计C语言的话,就不会做这个特殊规定,所有指针,一律返回该平台地址空间的字节大小

int a[100];
int *a;
也是一样。。

[ 本帖最后由 gtkmm 于 2009-12-19 20:47 编辑 ]
作者: flw    时间: 2009-12-19 20:47
这就是 C 程序员的现状。
C 程序员过于执迷细节,注重实践,但是对概念的辨析确实要差一些。

类型是什么?
数组又是什么?
别动不动就是“其实”、“本质上”、“只不过是”、“仅仅是”,
概念就是用来帮助理解表达思想的。
正确使用行业通用的有明确含义的名词和术语,是一个人职业素养的体现。

有关 C 是不是有数组类型,完全可以看 C 的标准条文,看看上面是不是提到了。
作者: prolj    时间: 2009-12-19 20:48
[fly]从来分不清指针和数组还有字符串的飘过[/fly]
实话,我没分清过,也没用错过。
中国人英语语法真好,可是能交流的不多,莎士比亚的语法错误都有人捧。
作者: system888net    时间: 2009-12-19 20:55
原帖由 flw 于 2009-12-19 20:47 发表
概念就是用来帮助理解表达思想的。



说的非常对.
作者: system888net    时间: 2009-12-19 20:56
原帖由 prolj 于 2009-12-19 20:48 发表
从来分不清指针和数组还有字符串的飘过
实话,我没分清过,也没用错过。


牛人.
作者: OwnWaterloo    时间: 2009-12-19 21:21
标题: 回复 #1 unistd 的帖子
结果你潜心专研的C语言, 也学的不咋嘀……

数组名和指针就是两回事。
通过数组名和指针访问数组元素, 前者比后者少一次访问。 指针多出的那一次操作, 并不是所有情况都能被优化掉。
一个简单的例子, 将一个符号定义为数组, 并在另一个翻译单元中声明为指针; 或者相反; 你看看会不会出问题吧。

数组名可以认为不占有空间, 也可以认为占有整个数组的空间。
数组名代表的是这个空间的起始地址。

指针变量占有空间。 指针代表的就是该变量所占空间的地址。
通过指针访问要先从指针变量的空间中得到数组的地址 —— 就是多这么一次访问 —— 然后再按数组方式访问。

数组名退化, 就是将数组的地址, 存放到一个指针变量中。 通过退化的数组访问, 依然会产生那一次获得地址的操作。
而且不再含有数组的类型信息。所以sizeof(a) 和 sizeof(ptr) 是不同的。
作者: OwnWaterloo    时间: 2009-12-19 21:24
标题: 回复 #20 OwnWaterloo 的帖子
char a[3];

a:  a的布局是:
0x??, 0x??, 0x??

访问a[i ]产生的代码是:
byte [a+i]

char* p;
p: p的布局是:
0x??, 0x??, 0x??, 0x??  // 假设32位

访问p[ i ]:产生的代码是:
byte [ dword [p] + i ]

[ 本帖最后由 OwnWaterloo 于 2009-12-19 21:30 编辑 ]
作者: OwnWaterloo    时间: 2009-12-19 21:27
标题: 回复 #7 unistd 的帖子
原帖由 unistd 于 2009-12-19 20:34 发表
把字符串数组sizeof之后得到字符串的大小,只能说是C语言的一个特殊规定而已我要是设计C语言的话,就不会做这个特殊规定,所有指针,一律返回该平台地址空间的字节大小


你够牛逼
作者: pmerofc    时间: 2009-12-19 21:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2009-12-19 21:49
提示: 作者被禁止或删除 内容自动屏蔽
作者: OwnWaterloo    时间: 2009-12-19 22:03
标题: 回复 #1 unistd 的帖子
原帖由 unistd 于 2009-12-19 20:14 发表
所以说,那个关于数组名能不能减1的帖子,根本没有必要讨论那么多页,,数组名仅仅是一个指针而已,它的类型为数组的元素类型的指针,,只是通常这个指针指向第一个元素,而且为常量而已!


以你的数组和指针的理解, 我确实不奢望你能明白那帖的意义。

无论是学简单的C也好,复杂的C++也罢, 心浮气躁、自以为是也就只能学个半罐水。
居然好意思开帖抛出"C语言不存在数组"的论点

别编程了, 洗洗睡吧 ……
作者: zx_wing    时间: 2009-12-19 22:04
当然,LZ这个命题有点偏激了。
flw的观点有道理。结合前面那个又臭又长的帖子,我也很有启发。

当接触的东西越多,我们的思维就越被已存在的事物所束缚,觉得世界就是这样的,而失去了设想另一种世界能力。
相信大部分CUer的知识都来自于平时的项目和专业书籍,这些知识都是细节性的,通过一点点的细节相互交织起来,勾勒出一幅图画,我们觉得:哦,这就是世界的样子。

C标准以及任何标准性的文档,却是抽象的概括各种可能。C标准出现的时候,世界上已经有很多不同的硬件了,它无法用一种准确的语言规定出一种放之四海而皆准的行为,就留下了很多和实现相关的部分。这些模糊的部分,从不同的视角去看,得到的是完全不一样的天地。

像我这样非计算机专业出生的人,知识大都来自于实践,看标准是一种从下而上的角度,看到的是限制。对于标准中模糊的地方,我会认为:哦,标准在这个地方模糊,是因为现实世界中的硬件有这样那样的限制,它只能规定成这样,无法有一个准确定义。

而像OwnWaterloo同学,我猜测是科班出生的。他看标准是一种自上而下的角度,看到的是可能性。当他看到标准中模糊的地方,就会想到不一样的可能性。既然标准没有指定,那就可能有一种新东西,有不一样的行为,但它确实是符合标准的。

所以当OwnWaterloo举出那种指针可能回绕的例子时,我最初的感觉是无理取闹,觉得这是胡搅蛮缠。因为我的思维限制在当前的计算机体系中,认为这种硬件是不可能存在的。后来静下心来一想,觉得这确实是有可能的,因为光从标准的角度看,存在这样的一种东西是完全合理的。更进一步说,即使存在一种在标准规定是无定义行为时引爆计算机的编译器也不足为奇。

其实都没错,只是站的角度不同而已。

这不经让我想起,在童年的时候,我们总问为什么世界是这样的。而现在,我们总是说世界就是这样的。何尝不是种悲哀。
作者: flw    时间: 2009-12-19 22:08
http://en.wikipedia.org/wiki/Datatype

Almost all programming languages explicitly include the notion of data type, though different languages may use different terminology. Most programming languages also allow the programmer to define additional data types, usually by combining multiple elements of other types and defining the valid operations of the new data type. For example, a programmer might create a new data type named "Person" that specifies that data interpreted as Person would include a name and a date of birth. Common data types may include:

    * integers,
    * floating-point numbers (decimals), and
    * alphanumeric strings.

For example, in the Java programming language, the "int" type represents the set of 32-bit integers ranging in value from -2,147,483,648 to 2,147,483,647, as well as the operations that can be performed on integers, such as addition, subtraction, and multiplication. Colors, on the other hand, are represented by three bytes denoting the amounts each of red, green, and blue, and one string representing that color's name; allowable operations include addition and subtraction, but not multiplication.

A data type also represents a constraint placed upon the interpretation of data in a type system, describing representation, interpretation and structure of values or objects stored in computer memory. The type system uses data type information to check correctness of computer programs that access or manipulate the data.

[ 本帖最后由 flw 于 2009-12-19 22:09 编辑 ]
作者: OwnWaterloo    时间: 2009-12-19 22:17
标题: 回复 #26 zx_wing 的帖子
泪奔    通情达理的zx_wing回来了   对实事求是的人,我不会无理取闹的

而对那些无理取闹的家伙嘛, 有闲心就教育他们两句, 没闲心就让他们自生自灭吧

原帖由 zx_wing 于 2009-12-19 22:04 发表
这不经让我想起,在童年的时候,我们总问为什么世界是这样的。而现在,我们总是说世界就是这样的。何尝不是种悲哀。

很哲理, 收藏一下
作者: OwnWaterloo    时间: 2009-12-19 22:24
标题: 回复 #26 zx_wing 的帖子
在此公开道歉, 如果在那个又臭又长(很形象,主要是有个机器人参合……)的帖子里语出冒犯了, 还请多多包涵

在那帖里说的对你的原印象并不是恭维,也正因为如此, 才想继续和实事求是的人多讨论讨论。
讨论嘛……  不擦枪走火、不温不火的, 那多没意思
作者: gigabyte    时间: 2009-12-20 00:00

作者: mik    时间: 2009-12-20 00:40
那个 _UNISTD_H_ 该不会是你的马甲吧?

如果是的话,进来观望您自打嘴巴


原帖由 _UNISTD_H_ 于 2009-12-12 11:31 发表
靠,你吃饱了撑的有必要看汇编代码吗?
这是C语言规定的,又不是编译器规定的!
C可能是为了把问题简单化,并且提高效率,所以规定运算中类型至少提升到整形(整形一般和系统的字长相同)
至于gcc它怎么实现 ...


原帖由 unistd 于 2009-12-19 20:14 发表
从汇编、机器、硬件的角度思考C语言的问题,才是正确地道路。。而且几十年来,到了今天,计算机仍然是几十年前的体系结构,就算出来更多的java/net,  C的这种工作方式仍然是有效的,,这是当代计算机软件的基础! ...

作者: OwnWaterloo    时间: 2009-12-20 02:06
标题: 回复 #31 mik 的帖子
围观lz
作者: xborant    时间: 2009-12-20 03:39
原帖由 unistd 于 2009-12-19 20:14 发表
在以他一些高级语言中,大都存在一种数组的类型,,该类型包含了若干元素,还有元素个数等其它属性。这些数组类型的对象是被当作一个整体来对待的。。。

但是在C中,可以说,不存在这种高级语言的数组类型

同意你这名话,C中不存在其它一些高级语言中的数组。

C中有C自己的数组。
作者: diffo    时间: 2009-12-20 09:29
根本不存在什么c,一切都是0和1。
而已
作者: pmerofc    时间: 2009-12-20 09:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: beepbug    时间: 2009-12-20 09:45
说C中不存在数组,或许是有点过。或许该说:在C中,没有真正的高级语言概念的数组。
楼主提出的问题,对初学者也有意义。弄清楚,C里“数组”与其它高级语言数组的区别,可以避免犯一些错误。譬如,在C里,数组的边界是虚拟的,你得管住自己的脚,误踩过去,后果是未知的。

[ 本帖最后由 beepbug 于 2009-12-20 09:51 编辑 ]
作者: 变异老鼠    时间: 2009-12-20 09:45
笑而不语~~

ISO/IEC 9899:1999
6.2.5 Types
20 Any number of derived types can be constructed from the object, function, and
   incomplete types, as follows:
   — An array type describes a contiguously allocated nonempty set of objects with a
       particular member object type, called the element type.36) Array types are
       characterized by their element type and by the number of elements in the array. An
       array type is said to be derived from its element type, and if its element type is T , the
       array type is sometimes called ‘‘array of T ’’. The construction of an array type from
       an element type is called ‘‘array type derivation’’.
36) Since object types do not include incomplete types, an array of incomplete type cannot be constructed.
作者: 朱果果    时间: 2009-12-20 13:13
不要用面向对象的思想看待C语言。
作者: pmerofc    时间: 2009-12-20 19:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: Esakyo    时间: 2009-12-20 21:59
谁是谁非,K&R说的算!
作者: tendy    时间: 2009-12-21 02:11
火气真大。。。

楼主有些偷换概念

先自定义了一个“数组”的概念,然后又拿它与c语言的“数组”来比较
得出c语言的“数组”不符合前者的结论。

一堆人关公战秦琼
作者: ypyf3000    时间: 2009-12-21 06:32
如果楼主的声明成立,我在想,我的那本——《C专家编程》往哪里摆?
作者: mcemil    时间: 2009-12-21 09:37
惨无人道的围观
另外提醒楼主赶紧去新闻板块寻找你失散多年的大哥bbjmmj
作者: mvnvn    时间: 2009-12-21 09:37
原帖由 gtkmm 于 2009-12-19 20:32 发表
char a[100];
char *b;

如果a,b类型相同,必有
sizeof( a) == size( b),是吧。




如果a,b不是同一类型
b = a;怎么不出现警告呢?
作者: zhujiang73    时间: 2009-12-21 09:50
原帖由 mvnvn 于 2009-12-21 09:37 发表




如果a,b不是同一类型
b = a;怎么不出现警告呢?


不是所有转换都警告  
作者: mvnvn    时间: 2009-12-21 09:52
原帖由 zhujiang73 于 2009-12-21 09:50 发表


不是所有转换都警告  

char a[100];
char *b;
你说 b = a;是类型转换了?证据?
作者: deargodzw    时间: 2009-12-21 10:00
原帖由 mvnvn 于 2009-12-21 09:52 发表

char a[100];
char *b;
你说 b = a;是类型转换了?证据?

那你又如何证明类型没转换呢?
作者: mvnvn    时间: 2009-12-21 10:04
原帖由 deargodzw 于 2009-12-21 10:00 发表

那你又如何证明类型没转换呢?



short  m;
int    n;

n = m;  你不知道这是类型转换?

[ 本帖最后由 mvnvn 于 2009-12-21 10:05 编辑 ]
作者: laura.kylin    时间: 2009-12-21 10:04
汗啊!真汗!数组不数组,只是一种语言的数据组织形式,最终要以汇编或二进制机械码连理解才行,楼主啊,你!
唉!
作者: zhujiang73    时间: 2009-12-21 10:06
原帖由 mvnvn 于 2009-12-21 09:52 发表

char a[100];
char *b;
你说 b = a;是类型转换了?证据?


“疑罪从无”  
作者: mvnvn    时间: 2009-12-21 10:08
原帖由 zhujiang73 于 2009-12-21 10:06 发表


“疑罪从无”  


作者: retuor    时间: 2009-12-21 10:12
我准备论证世界上不存在楼主。
作者: zhujiang73    时间: 2009-12-21 10:19
原帖由 retuor 于 2009-12-21 10:12 发表
我准备论证世界上不存在楼主。


本质上只是时空里一团聚集在一起按照数学规律波动着的能量。
作者: ekek86    时间: 2009-12-21 10:26
原帖由 gtkmm 于 2009-12-19 20:32 发表
char a[100];
char *b;

如果a,b类型相同,必有
sizeof( a) == size( b),是吧。


a也是char*类型,a的元素是char类型,所以a和b是同一类型。
sizeof( a)是编译器用“sizeof(char)*100”替换了sizeof( a)

[ 本帖最后由 ekek86 于 2009-12-21 10:35 编辑 ]
作者: mcemil    时间: 2009-12-21 10:43
马甲多,还是傻叉多,还真不好说
作者: 论坛热点    时间: 2009-12-21 10:49
标题: 回复 #44 mvnvn 的帖子
这个反问牛!!!!
作者: 论坛热点    时间: 2009-12-21 10:56
char a[100];
char *b;


原帖由 ekek86 于 2009-12-21 10:26 发表


a也是char*类型,a的元素是char类型,所以a和b是同一类型。
sizeof( a)是编译器用“sizeof(char)*100”替换了sizeof( a)


好了,这个才是正确的答案!!!前面那些回复浪费的纸张就只能留作擦屁股纸用了。
我宣布这个贴就此结束!LZ胜利赢了
作者: zhujiang73    时间: 2009-12-21 10:58
原帖由 ekek86 于 2009-12-21 10:26 发表


a也是char*类型,a的元素是char类型,所以a和b是同一类型。
sizeof( a)是编译器用“sizeof(char)*100”替换了sizeof( a)



> 所以a和b是同一类型。

那可以  a =  b 吗
作者: 论坛热点    时间: 2009-12-21 11:00
如果你想回帖,请先看#57楼
作者: zhujiang73    时间: 2009-12-21 11:03
原帖由 论坛热点 于 2009-12-21 11:00 发表
如果你想回帖,请先看#57楼



        char a[100];
        char *b;

        a = b;


这个编译过不去。

[ 本帖最后由 zhujiang73 于 2009-12-21 11:06 编辑 ]
作者: zjhzxg    时间: 2009-12-21 11:06
建议看看 c专家编程,别搞噱头
作者: 松饼熊    时间: 2009-12-21 11:23
一颗茴香豆被你们都搞出花来了。
作者: jeanlove    时间: 2009-12-21 11:31
原帖由 unistd 于 2009-12-19 20:14 发表
在以他一些高级语言中,大都存在一种数组的类型,,该类型包含了若干元素,还有元素个数等其它属性。这些数组类型的对象是被当作一个整体来对待的。。。

但是在C中,可以说,不存在这种高级语言的数组类型, ...


你说的很对,我支持你。
何止是数组,除了导出.h文件的声明以外,.cpp内部的struct,class实现,只要是没有虚函数的,编译了以后就是一堆地址,所有的类型信息都消失了。

只有含有了虚函数的接口的类型,才会有运行时的信息留下来。静态的类型在编译期全都被消灭了。
作者: 电动武松    时间: 2009-12-21 12:01

作者: xborant    时间: 2009-12-21 12:57
想起了这个帖子。

讨论下这个题目,请不要先编译
作者: cjaizss    时间: 2009-12-21 13:10
lz说的挺好,干嘛大家要K他?
虽然言辞有些偏激,但其实我也很想这么说.
大家不必要按照他字面上说的来喷他吧
作者: pmerofc    时间: 2009-12-21 13:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: OwnWaterloo    时间: 2009-12-21 14:41
标题: 回复 #58 zhujiang73 的帖子
原帖由 zhujiang73 于 2009-12-21 10:58 发表

> 所以a和b是同一类型。
那可以  a =  b 吗


这个反问牛!


btw: 几乎每个讨论指针的热帖, 最终都会成为笑话的源泉
这帖有潜力!  顶一下
作者: unistd    时间: 2009-12-21 15:02
原帖由 zhujiang73 于 2009-12-21 10:58 发表



> 所以a和b是同一类型。

那可以  a =  b 吗


是 a == b,而不是 a = b,这孩子,C基础没学好。。。
作者: 獨照づ幔紗    时间: 2009-12-21 15:11
弱弱的问一句,什么是数组?
作者: pmerofc    时间: 2009-12-21 15:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: cjaizss    时间: 2009-12-21 15:26
LZ的观点我觉得挺好,但我还是觉得有点偏激.
LZ可能觉得现在的C还不够"高级汇编",一定要整出一个真正的"高级汇编",而不是"高级宏汇编".
你说的没错,struct等东西其实说白了都可以当成是语法糖.
然而,语法糖有语法糖的好处,它可以使代码看起来更舒服,于是更适合编码,且丝毫不影响其"高级汇编"性
不太有人愿意跟个没有任何词语修饰的内存打交道,那样会引起思维/视觉疲劳的.
就如同当初大家看机器语言看烦了,于是汇编就出来了一样.然而汇编的出现一点都没有影响其"机器"性,反而使得看起来更舒服了.
难道不是吗?
作者: 给个理由先    时间: 2009-12-21 16:42
走火入魔了
作者: modoke    时间: 2009-12-21 16:57
(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组,包含的信息不仅仅是地址;

(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量,这时实际实现是数组名退化,含有的信息减少了,但是这样使用时,这些信息足够用了(即地址);

(3)指向数组的指针则是另外一种变量类型(在win32平台下,长度为4),仅仅意味着数组的存放地址!

信息量(1)> 信息量(2)= 信息量(3)
这样说是不是好点?
作者: 论坛热点    时间: 2009-12-21 19:20
刚下课,过来看看又有多少傻子在此贴制造擦屁股纸!
我在第59楼说过“如果你想回帖,请先看#57楼”,傻子还真不少
先回复这个愚蠢的提问,一个个收拾。。。

原帖由 zhujiang73 于 2009-12-21 10:58 发表



> 所以a和b是同一类型。

那可以  a =  b 吗


char a[100];
char *b;

你问"那可以  a =  b 吗?"

我问你,如果编译器允许这样,它还要做搬运100个字节的工作,操他妈,那个编译器如此他妈地傻逼!!!!
作者: OwnWaterloo    时间: 2009-12-21 19:26
标题: 回复 #75 论坛热点 的帖子
如果你想回帖, 请先看20楼和21楼, 然后洗干净你的嘴, 告诉大家, 你明白数组和指针的不同了吗? 它们还是一回事吗?
作者: 论坛热点    时间: 2009-12-21 19:26
标题: 回复 #68 OwnWaterloo 的帖子
你就别来凑热闹了,一看到你的回帖就直接滑过
作者: OwnWaterloo    时间: 2009-12-21 19:27
标题: 回复 #77 论坛热点 的帖子
无知
作者: 论坛热点    时间: 2009-12-21 19:31
这个帖子该结束了,最终LZ获胜!
在如果你想回帖,请先看ekek86 在#57楼的回复和我在#75楼的回复
作者: OwnWaterloo    时间: 2009-12-21 19:32
标题: 回复 #79 论坛热点 的帖子
原帖由 论坛热点 于 2009-12-21 19:31 发表
这个帖子该结束了,最终LZ获胜!
在如果你想回帖,请先看ekek86 在#57楼的回复和我在#75楼的回复


阿q
作者: marlalee    时间: 2009-12-21 20:11
自从学了指针以后,数组的东西就全扔了。
随着时间的推移,数组的东西已经全忘了,
现在只会用指针。
另外,C 被称为“高级汇编语言”,LZ的想法其实很正常,不值得大惊小怪。
作者: 论坛热点    时间: 2009-12-21 20:26
原帖由 marlalee 于 2009-12-21 20:11 发表
自从学了指针以后,数组的东西就全扔了。
随着时间的推移,数组的东西已经全忘了,
现在只会用指针。
另外,C 被称为“高级汇编语言”,LZ的想法其实很正常,不值得大惊小怪。


谁说过C 是“高级汇编语言”?

这个帖子该结束了,最终LZ获胜!
在如果你想回帖,请先看ekek86 在#57楼的回复和我在#75楼的回复
作者: modoke    时间: 2009-12-21 20:27
再不删贴出人命了!!!!!!!!
作者: zhujiang73    时间: 2009-12-21 20:32
原帖由 论坛热点 于 2009-12-21 19:20 发表
刚下课,过来看看又有多少傻子在此贴制造擦屁股纸!
我在第59楼说过“如果你想回帖,请先看#57楼”,傻子还真不少
先回复这个愚蠢的提问,一个个收拾。。。



char a[100];
char *b;

你问"那可以  ...


就算编译器做这傻事也只是让 100 个字节数据作废而已,不用搬运任何东西。

机器人的 ai 还是不行呀,我认为这个 id 是一个用 oioic 写的机器人。
作者: zhujiang73    时间: 2009-12-21 20:36
原帖由 modoke 于 2009-12-21 20:27 发表
再不删贴出人命了!!!!!!!!


讨论这些问题大家就不会去新闻版讨论政治了,这样 CU 就安全了。
作者: 论坛热点    时间: 2009-12-21 20:39
原帖由 zhujiang73 于 2009-12-21 20:32 发表


就算编译器做这傻事也只是让 100 个字节数据作废而已,不用搬运任何东西。

机器人的 ai 还是不行呀,我认为这个 id 是一个用 oioic 写的机器人。

草,你是真傻还是装傻? 我认为你是真傻吧,这样我才有耐心回答。
如果这100字节里有有用数据呢?即使没有有用数据也须重新申请100字节的内存呀,傻子明白了么傻子

ps: 你一口一个oioic,你对oioic很感兴趣呀

[ 本帖最后由 论坛热点 于 2009-12-21 20:42 编辑 ]
作者: 论坛热点    时间: 2009-12-21 20:46
这个帖子该结束了,最终LZ获胜!
在如果你想回帖,请先看ekek86 在#57楼的回复和我在#75、#86楼的回复
作者: OwnWaterloo    时间: 2009-12-21 20:47
标题: 回复 #84 zhujiang73 的帖子
原帖由 zhujiang73 于 2009-12-21 20:32 发表
机器人的 ai 还是不行呀,我认为这个 id 是一个用 oioic 写的机器人。


这是赤果果的侮辱!
这对赵平智是不公平的!
作者: zhujiang73    时间: 2009-12-21 20:51
原帖由 论坛热点 于 2009-12-21 20:39 发表

草,你是真傻还是装傻? 我认为你是真傻吧,这样我才有耐心回答。
如果这100字节里有有用数据呢?即使没有有用数据也须重新申请100字节的内存呀,傻子明白了么傻子

ps: 你一口一个oioic,你对o ...


我是真傻

> 如果这100字节里有有用数据呢?

保证这100 字节里没有有用数据是程序员的责任,不是 C 编译器的责任。


我对 oicc 感兴趣。
作者: 论坛热点    时间: 2009-12-21 20:54
这个帖子该结束了,最终LZ获胜!
在如果你想回帖,请先看ekek86 在#57楼的回复和我在#75、#86楼的回复
作者: 论坛热点    时间: 2009-12-21 20:56
哈哈,一有关于C和C++比较的帖子,某些人就想到oioic ,真逗
作者: zhujiang73    时间: 2009-12-21 20:57
原帖由 OwnWaterloo 于 2009-12-21 20:47 发表


这是赤果果的侮辱!
这对赵平智是不公平的!


我错了。
作者: 论坛热点    时间: 2009-12-21 20:57
这个帖子该结束了,最终LZ获胜!
在如果你想回帖,请先看ekek86 在#57楼的回复和我在#75、#86楼的回复
作者: unistd    时间: 2009-12-21 20:58
原帖由 zhujiang73 于 2009-12-21 20:51 发表


我是真傻

> 如果这100字节里有有用数据呢?

保证这100 字节里没有有用数据是程序员的责任,不是 C 编译器的责任。


我对 oicc 感兴趣。



what's the difference between Objective-C and  oicc?
作者: zhujiang73    时间: 2009-12-21 20:59
原帖由 论坛热点 于 2009-12-21 20:56 发表
哈哈,一有关于C和C++比较的帖子,某些人就想到oioic ,真逗



这叫 oi 横久远,经典永流传。
作者: zhujiang73    时间: 2009-12-21 21:05
原帖由 unistd 于 2009-12-21 20:58 发表



what's the difference between Objective-C and  oicc?


不大了解 Objective-C 不好评论。
作者: 论坛热点    时间: 2009-12-21 21:08
回去备课了,不跟傻子玩了

这个帖子该结束了,最终LZ获胜!
如果你想回帖,请先看ekek86 在#57楼的回复和我在#75楼的回复
作者: modoke    时间: 2009-12-21 21:11
严重要求删帖,还有很多有用的急需解决的问题等着大侠们帮忙解决一下,这个帖子实在是太障碍了!
作者: zhujiang73    时间: 2009-12-21 21:15
原帖由 论坛热点 于 2009-12-21 21:08 发表
回去备课了,不跟傻子玩了

这个帖子该结束了,最终LZ获胜!
如果你想回帖,请先看ekek86 在#57楼的回复和我在#75楼的回复



别跑呀,发帖有分,分可以换礼品的。  


>  回去备课了

备课? 难道你要给学生上课讲 C 语言。

那些孩子们真可怜
作者: modoke    时间: 2009-12-21 21:24
原帖由 论坛热点 于 2009-12-21 10:56 发表
char a[100];
char *b;




好了,这个才是正确的答案!!!前面那些回复浪费的纸张就只能留作擦屁股纸用了。
我宣布这个贴就此结束!LZ胜利赢了



a和b不是一个类型,为什么非得说a是个什么类型?
对编译器来说,a代表着你要维护一个数据结构,指针仅仅知道一个地址,你笨想一下,编译器是咋知道那个100的?
所以说数组名a不仅仅是个存地址的指针,要比指针维护更多的信息!!!!!!!!!!!!!!
(PS:我真想用1W个叹号!)
删帖吧 , 严重请求!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2