user-0 提问: C语言数组处理

回复:
user: user-1
content: C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 非常不错的解答

user: user-3
content: 引用 10 楼 lin5161678 的回复:[quote=引用 9 楼 自信男孩 的回复:][quote=引用 8 楼 lin5161678 的回复:]错的就只是 vla长度是0 并且越界 这两点 和指针没有任何关系  理解不一样～[/quote] 那就是你理解错了[/quote] 把数组理解为指针有错吗（当然数组和指针还是有区别的）？数组名除了不能做左值外，还有其他的区别吗？

user: user-4
content: 引用 9 楼 自信男孩 的回复:[quote=引用 8 楼 lin5161678 的回复:]错的就只是 vla长度是0 并且越界 这两点 和指针没有任何关系  理解不一样～[/quote] 那就是你理解错了

user: user-3
content: 引用 8 楼 lin5161678 的回复:[quote=引用 7 楼 自信男孩 的回复:][quote=引用 6 楼 lin5161678 的回复:][quote=引用 3 楼 自信男孩 的回复:]a数组的长度需要事先定义好，C语言不支持可变数组长度的。C支持 这里错的不是用变了定义数组大小 这里错的是越界 并且数组大小是0 [/quote] 这里定义的其实就是一个指针，还是一个野指针。对于野指针的使用结果是未定义的。  可变数组可能描述的有歧义，这个在C语言里应该怎么描述呢？应该描述成：不定长数组；当然这里也不是不定长的，而是指定义了一个长度不足的（或者直接理解为一个野指针或许更好）[/quote]错的就只是 vla长度是0 并且越界 这两点 和指针没有任何关系[/quote]  理解不一样～

user: user-4
content: 引用 7 楼 自信男孩 的回复:[quote=引用 6 楼 lin5161678 的回复:][quote=引用 3 楼 自信男孩 的回复:]a数组的长度需要事先定义好，C语言不支持可变数组长度的。C支持 这里错的不是用变了定义数组大小 这里错的是越界 并且数组大小是0 [/quote] 这里定义的其实就是一个指针，还是一个野指针。对于野指针的使用结果是未定义的。  可变数组可能描述的有歧义，这个在C语言里应该怎么描述呢？应该描述成：不定长数组；当然这里也不是不定长的，而是指定义了一个长度不足的（或者直接理解为一个野指针或许更好）[/quote]错的就只是 vla长度是0 并且越界 这两点 和指针没有任何关系

user: user-3
content: 引用 6 楼 lin5161678 的回复:[quote=引用 3 楼 自信男孩 的回复:]a数组的长度需要事先定义好，C语言不支持可变数组长度的。C支持 这里错的不是用变了定义数组大小 这里错的是越界 并且数组大小是0 [/quote] 这里定义的其实就是一个指针，还是一个野指针。对于野指针的使用结果是未定义的。  可变数组可能描述的有歧义，这个在C语言里应该怎么描述呢？应该描述成：不定长数组；当然这里也不是不定长的，而是指定义了一个长度不足的（或者直接理解为一个野指针或许更好）

user: user-4
content: 引用 3 楼 自信男孩 的回复:a数组的长度需要事先定义好，C语言不支持可变数组长度的。C支持 这里错的不是用变了定义数组大小 这里错的是越界 并且数组大小是0

user: user-3
content: 引用 30 楼 lin5161678 的回复:[quote=引用 27 楼 自信男孩 的回复:]  你解析的通透，能被别人理解吗？你通透了，那是你的，不能给别人。在论坛里是帮助别人解决问题，不是炫耀你理解的通透了。 愿意思考当然能够理解 请问 数组类型在特定情况下会隐式转换为指向数组第一个元素的指针 而不是数组是指针 这句话 哪一个字不理解? 没有先入为主并且放弃思考的人 都能理解这句话[/quote] 我真没说过数组就是指针吧，如果说了，那我确实说错了，我道歉，向楼主和看到的帖子的朋友们道歉：我传播了错误的论点。

user: user-3
content: 引用 32 楼 均陵鼠侠 的回复:[quote=引用 28 楼 自信男孩 的回复:][quote=引用 25 楼 均陵鼠侠 的回复:]我的发言看起来象是在吵架吗？这是从哪里看出来的。我本不想参与这个讨论，但是看到小林同学在场，所以也掺和一下。如果觉得我是在吵架，我就不说话了，反正CSDN我很少来，就是隔一段时间来瞅瞅。我又不拿CSDN的好处，没必要在这里为一些非常简单的话题浪费时间。 代码写出来是让别人看的，不是炫耀的。写出对的，但是别人不容易理解的代码，意义仅限于自己的吧，代码的可读性呢？  int g; ( & g) [0] = 5; 对于这样的代码～[/quote]我都不知道说什么好了，你为什么总抓不住重点。我强调的是要引入“整数名”和“浮点名”，而且认为“整数名也是数组，也是指针”，所以举了这样一个例子，你又往代码的可读性上扯。没有可读性就不是代码了？没有可读性就不能运行了？它是不是合法的C语言代码呢？这样唠嗑啥时候才能是个头哇。[/quote] 那就不要唠了，那你还回复啥呀～既然知道没有头，越来越不在楼主的频道上了。嘴上说着没意思唠了，手上还很诚实～

user: user-5
content: 引用 28 楼 自信男孩 的回复:[quote=引用 25 楼 均陵鼠侠 的回复:]我的发言看起来象是在吵架吗？这是从哪里看出来的。我本不想参与这个讨论，但是看到小林同学在场，所以也掺和一下。如果觉得我是在吵架，我就不说话了，反正CSDN我很少来，就是隔一段时间来瞅瞅。我又不拿CSDN的好处，没必要在这里为一些非常简单的话题浪费时间。 代码写出来是让别人看的，不是炫耀的。写出对的，但是别人不容易理解的代码，意义仅限于自己的吧，代码的可读性呢？  int g; ( & g) [0] = 5; 对于这样的代码～[/quote]我都不知道说什么好了，你为什么总抓不住重点。我强调的是要引入“整数名”和“浮点名”，而且认为“整数名也是数组，也是指针”，所以举了这样一个例子，你又往代码的可读性上扯。没有可读性就不是代码了？没有可读性就不能运行了？它是不是合法的C语言代码呢？这样唠嗑啥时候才能是个头哇。

user: user-4
content: 引用 29 楼 均陵鼠侠 的回复:我说小林，我在#24楼的发言难道不好笑吗？为什么不笑？[/quote] 我受过严格的训练  无论有多好笑 我都不会笑 除非忍不住

user: user-4
content: 引用 27 楼 自信男孩 的回复:你解析的通透，能被别人理解吗？你通透了，那是你的，不能给别人。在论坛里是帮助别人解决问题，不是炫耀你理解的通透了。 愿意思考当然能够理解 请问 数组类型在特定情况下会隐式转换为指向数组第一个元素的指针 而不是数组是指针 这句话 哪一个字不理解? 没有先入为主并且放弃思考的人 都能理解这句话

user: user-5
content: 引用 26 楼 lin5161678 的回复:[quote=引用 22 楼 自信男孩 的回复:]我说小林，我在#24楼的发言难道不好笑吗？为什么不笑？

user: user-3
content: 引用 25 楼 均陵鼠侠 的回复:我的发言看起来象是在吵架吗？这是从哪里看出来的。我本不想参与这个讨论，但是看到小林同学在场，所以也掺和一下。如果觉得我是在吵架，我就不说话了，反正CSDN我很少来，就是隔一段时间来瞅瞅。我又不拿CSDN的好处，没必要在这里为一些非常简单的话题浪费时间。 代码写出来是让别人看的，不是炫耀的。写出对的，但是别人不容易理解的代码，意义仅限于自己的吧，代码的可读性呢？  int g; ( & g) [0] = 5; 对于这样的代码～

user: user-3
content: 引用 26 楼 lin5161678 的回复:[quote=引用 22 楼 自信男孩 的回复:] 好吧，继续这样的沟通没有意义，我一说访问，你就提出char和int的区别，这么说还有struct ,union等等这些类型访问的区别呢，所以，这样的反驳我无话可说。你理解的并不是我理解的，看来这句话在我们的沟通中是成立的。  建议不要总批判的去理解别人的话，能从对方的话语中理解或吸收有用的东西，这样是进步的源泉，上来就反对，如果反对的全对还好说，不全对，我感觉没多少意义，除了能获取自己很厉害的快感，还能干啥？ 你的观点不存在值得吸收的内容 所谓的数组是指针  是一个错误的 对理解C语言毫无帮助 对编程实践毫无价值的说法 并且早就被解析通透并早已被我摒弃  数组隐式转换为指向数组第一个元素 可以解释一切关于数组和指针相关的内容 数组是指针 只会遇到越来越多的困惑 越思考越撕裂 放弃思考才会认为这个解释很合理[/quote] 你的语言里透漏出霸气：  并且早就被解析通透并早已被我摒弃  你解析的通透，能被别人理解吗？你通透了，那是你的，不能给别人。在论坛里是帮助别人解决问题，不是炫耀你理解的通透了。

user: user-4
content: 引用 22 楼 自信男孩 的回复:好吧，继续这样的沟通没有意义，我一说访问，你就提出char和int的区别，这么说还有struct ,union等等这些类型访问的区别呢，所以，这样的反驳我无话可说。你理解的并不是我理解的，看来这句话在我们的沟通中是成立的。  建议不要总批判的去理解别人的话，能从对方的话语中理解或吸收有用的东西，这样是进步的源泉，上来就反对，如果反对的全对还好说，不全对，我感觉没多少意义，除了能获取自己很厉害的快感，还能干啥？ 你的观点不存在值得吸收的内容 所谓的数组是指针  是一个错误的 对理解C语言毫无帮助 对编程实践毫无价值的说法 并且早就被解析通透并早已被我摒弃  数组隐式转换为指向数组第一个元素 可以解释一切关于数组和指针相关的内容 数组是指针 只会遇到越来越多的困惑 越思考越撕裂 放弃思考才会认为这个解释很合理

user: user-5
content: 我的发言看起来象是在吵架吗？这是从哪里看出来的。我本不想参与这个讨论，但是看到小林同学在场，所以也掺和一下。如果觉得我是在吵架，我就不说话了，反正CSDN我很少来，就是隔一段时间来瞅瞅。我又不拿CSDN的好处，没必要在这里为一些非常简单的话题浪费时间。

user: user-5
content: “因为这么理解了，对于很多的使用，比如访问数组或指针地址的方式；便于更好的使用和运用；”------恰恰相反，就是因为和稀泥，搞不清楚，所以很难使用和运用，更谈不上写出优美、简练的代码。你看看赵4老湿平时写的程序就知道了。他的程序我一次也没有读过，太。。。怎么说呢，太闹心了。  我准备建议WG14引入一批新的术语，叫做“整数名”、“浮点名”。而且，因为以下代码 int g; ( & g) [0] = 5; 可以正常工作，所以我决定下一个结论：整数名在某些条件下等同于数组；在某些条件下也等同于指针。

user: user-3
content: 引用 21 楼 均陵鼠侠 的回复:[quote=引用 15 楼 自信男孩 的回复:][quote=引用 14 楼 lin5161678 的回复:][quote=引用 11 楼 自信男孩 的回复:] 把数组理解为指针有错吗（当然数组和指针还是有区别的）？数组名除了不能做左值外，还有其他的区别吗？ 首先 数组名是左值表达式 然后 数组理解为指针当然是错的  数组本质是内存中一块连续的内存块 相同类型的元素的集合 指针显然完全另一回事  根本区别 数组是一种聚合类型 指针是一种标量类型 两者是C类型系统完全不同 各自独立的组成部分   (int[10])value //是错的 (int*)value //是对的   sizeof(数组类型)和sizeof(指针类型)有区别  int arr[10]; //&arr 是一个数组指针类型表达式 类型是 int(*)[10] int* p; //&p 是一个二级指针表达式 类型是 int**  等等  两者区别多的是  所谓的数组是指针 完全的是对 数组在特定情况下会隐式转换为指向数组第一个元素的指针 这个规则的误读[/quote]  数组和指针在访问上没有区别的，我认为在一些方面是可以将数组理解为指针，也可以把指针理解为数组，你罗列这么多，咱们关注点不一样呢，你关注区别，我专注类似。为什么要关注类似，因为这么理解了，对于很多的使用，比如访问数组或指针地址的方式；便于更好的使用和运用；  指针和数组如果完全一样，我想也没必要定义两个名称了，这个起码的区别我想我还是能够分辨的吧。 比如数组名作为参数传递，那么形参的处理，编译器是按照指针来处理的，虽然你定义的参数是数组形式；  多方面的看待问题，而不是两个面的去评价一个问题：要么对，要么错；不同场景下，可以有不同的理解；  数组和指针有区别又有相似性；我想这个观点你应该认同吧[/quote]  按照这个观点，发明高级语言是错误的，是不必要的。因为这番言论完全否定了抽象的必要性，而高级语言正是对底层以及低一级层次的逻辑抽象。每种语言都要自圆其说，都有其自洽性和完备性，数据类型必须是层次分明的。  分析C语言程序，自然要站在C语言自身的逻辑圈子里进行，你拿汇编语言层面的事物来解释C语言的东西，已经超越了C语言本身的逻辑。更何况，在机器语言里，哪还有什么数组和指针，都是一连串的字节或者比特。[/quote] 你这么理解也没错，但是这是再讨论问题吗？这是在吵架，说一些看是对的，但是与议题无关的内容，这样你觉得很厉害了？