WM_CH 发表于 2016-3-29 14:53:42

吊丝整理C语言 数组指针 指针数组

本帖最后由 WM_CH 于 2016-3-29 14:55 编辑

主要针对指针数组和数组指针。
大家看看对不对。
没有啥好办法把文档内容贴出来。先贴几个图片吧。


有兴趣的可以下载附件。




{:smile:}








河图洛书 发表于 2016-3-29 14:58:16

是楼主自己整理的吗

WM_CH 发表于 2016-3-29 14:59:21

河图洛书 发表于 2016-3-29 14:58
是楼主自己整理的吗

嗯,之前看视频,做的笔记,现在整理成电子档

河图洛书 发表于 2016-3-29 15:10:44

WM_CH 发表于 2016-3-29 14:59
嗯,之前看视频,做的笔记,现在整理成电子档

赞一个,下下来好好学习下

bbbbbv 发表于 2016-3-29 15:39:36

不错,帮顶。

Excellence 发表于 2016-3-29 15:41:01

{:handshake:}{:handshake:}{:handshake:}

LICHANGAN726 发表于 2016-3-29 16:11:04

下载学习一下

lu976046395 发表于 2016-3-29 18:53:11

学习一下   

lcl 发表于 2016-3-29 19:25:06

顶一个~{:victory:}{:victory:}{:victory:}

wang55 发表于 2016-3-29 19:25:13

又可以复习一下指针了。多谢分享。

shwind 发表于 2016-3-29 19:27:41

不错的资料,学习了

涧边梧桐 发表于 2016-3-29 20:41:24

不错,收藏学习。

zaldy30 发表于 2016-3-29 22:15:47

不错的资料,多谢分享。

我爱大秦 发表于 2016-3-30 08:02:33

很容易晕乎,指针数组,数组指针,指针函数,函数指针

gonboy 发表于 2016-4-1 09:43:29

本帖最后由 gonboy 于 2016-4-1 11:38 编辑

把指针不停的镶嵌,比较谁厉害,也只能变成老学究了。

takashiki 发表于 2016-4-1 11:56:52

WM_CH 发表于 2016-3-29 14:59
嗯,之前看视频,做的笔记,现在整理成电子档

LZ,不得不说,你的图片的第二行红字部分是错的,错得离谱!希望您能领会。

指针和数组完全不同,虽然在C语言内部看来处理差不多,但是!
数组是分配在栈上的,指针是分配在堆上的,能一样吗?只有数组名才会等效于指针。
典型的,sizeof(指针)和sizeof(数组)得到的大小截然不同。可以作为佐证。
就相当于,你的身份证代表了你这个人,但是你的身份证就是你自身吗?

myxiaonia 发表于 2016-4-1 12:10:53

a[]这个是什么鬼没见过这种形式

myxiaonia 发表于 2016-4-1 12:15:39

takashiki 发表于 2016-4-1 11:56
LZ,不得不说,你的图片的第二行红字部分是错的,错得离谱!希望您能领会。

指针和数组完全不同,虽然在 ...

数组其实是个数据类型代表一个内存块其实和结构体非常类似   不过当年为方便计作为参数传递时数组名会转换成指针形式

我看到过有人构造一个实例,数组名理解成指针常量是错误的

takashiki 发表于 2016-4-1 12:31:45

myxiaonia 发表于 2016-4-1 12:10
a[]这个是什么鬼没见过这种形式

这个和a[]是一样的,只不过维度提升了。一般用于函数传参或结构体的不完全类型中。一般用到三维数组的情况极少极少,教科书除外。
C语言的数组本质上都是一维的,还是定长的,真正的多维数组只能靠指针来实现。

Xy201207 发表于 2016-4-1 12:46:13

takashiki 发表于 2016-4-1 11:56
LZ,不得不说,你的图片的第二行红字部分是错的,错得离谱!希望您能领会。

指针和数组完全不同,虽然在 ...

怎么理解的"数组是分配在栈上的,指针是分配在堆上的"??sizeof(指针)在同一个平台都是固定值。“你的身份证代表了你这个人,但是你的身份证就是你自身吗?”这个例子也让我加深里这两者的区别{:lol:}

takashiki 发表于 2016-4-1 13:41:57

Xy201207 发表于 2016-4-1 12:46
怎么理解的"数组是分配在栈上的,指针是分配在堆上的"??sizeof(指针)在同一个平台都是固定值。“你的 ...

借用单片机的属于进行类比,或许更容易理解些

栈相当于直接寻址,堆相当于间接寻址。一般直接寻址的也能用间歇寻址折腾,因此数组也能被编译器当做指针访问。

myxiaonia 发表于 2016-4-1 13:53:31

takashiki 发表于 2016-4-1 12:31
这个和a[]是一样的,只不过维度提升了。一般用于函数传参或结构体的不完全类型中。一般用到三维数组的情 ...

主要是为看他对于a都没有一个定义,看最后a是个int型我以为定义了一个a的数组,所以就看不懂这是个什么操作

qq78929709 发表于 2016-4-1 13:57:56

资料不错

WM_CH 发表于 2016-4-1 16:17:33

takashiki 发表于 2016-4-1 13:41
借用单片机的属于进行类比,或许更容易理解些

栈相当于直接寻址,堆相当于间接寻址。一般直接寻址的也能 ...

嗯嗯,学到了。谢谢指教。
我也是新手,整理了这些,确实错误百出。大家就把对的理解了,错的引以为戒吧。
{:smile:}

Xy201207 发表于 2016-4-1 19:42:03

WM_CH 发表于 2016-4-1 16:17
嗯嗯,学到了。谢谢指教。
我也是新手,整理了这些,确实错误百出。大家就把对的理解了,错的引以为戒吧 ...

没理解“栈相当于直接寻址,堆相当于间接寻址。”

片羽之神 发表于 2016-4-1 20:59:27

mark!!!

blade_li 发表于 2016-4-2 05:16:37

纸上得来终觉浅,做个液晶菜单项目就明了了

wiser803 发表于 2016-4-2 06:58:37

指针就是C 较难以把握的特色之一,即使老手有时也会出错,何况新手肯定会折腾不断。
教科书只能学到初步概念(包括有些谈指针的书),而学不到真正如何使用的,最好的学习方法是去看一些实际项目和应用,如:仔细研读OS核心代码等。

AllEle 发表于 2016-4-2 18:34:00

不错,顶一个

自由飞儿 发表于 2016-4-2 18:51:03

很不错,攒

kuodemon 发表于 2016-4-29 22:40:39

對於中階學習者來說是好資料, 值得推一把.

chenxujiaoyang 发表于 2016-4-30 00:05:29

好奇心进来看看,看见图片忍不住笑了,图片红色文字说“数组是一个指针常量”,我相信这句话在正规的书本中绝对找不到,还有ar怎么会被转换成ar+1呢?不应该是*(ar+1)么?

taoxy_wx 发表于 2017-6-1 18:42:49

都快忘的差不多了
下载下来
重新学习下
谢谢

WM_CH 发表于 2017-6-1 23:41:23

taoxy_wx 发表于 2017-6-1 18:42
都快忘的差不多了
下载下来
重新学习下


推荐您注意看楼上各位大大的指点,
里面有很多错误之处,抱歉

xuzhiping9889 发表于 2017-7-4 17:13:00

{:handshake:}{:handshake:}{:handshake:}{:handshake:}

WM_CH 发表于 2017-7-10 14:30:33

takashiki 发表于 2016-4-1 13:41
借用单片机的属于进行类比,或许更容易理解些

栈相当于直接寻址,堆相当于间接寻址。一般直接寻址的也能 ...

兄台您好,下面这三句话,是我从您的回复中提取出来的。

1. 数组是分配在栈上的,指针是分配在堆上的。只有数组名才会等效于指针。典型的,sizeof(指针)和sizeof(数组)得到的大小截然不同。

2. 栈相当于直接寻址,堆相当于间接寻址。一般直接寻址的也能用间歇寻址折腾,因此数组也能被编译器当做指针访问。

3. C语言的数组本质上都是一维的,还是定长的,真正的多维数组只能靠指针来实现。

当年刚刚从事单片机工作,对您说的还领会不到是什么意思。
奈何工作两年之后,碰到这里还是不太清楚。还请指教第1.2条的出处在哪里,我回去翻下书。谢谢兄台。






Gorgon_Meducer 发表于 2017-7-10 21:17:44

WM_CH 发表于 2017-7-10 14:30
兄台您好,下面这三句话,是我从您的回复中提取出来的。

1. 数组是分配在栈上的,指针是分配在堆上的。 ...

忍不住要驳斥以下观点——误人子弟:

1. 数组是分配在栈上的,指针是分配在堆上的。只有数组名才会等效于指针。典型的,sizeof(指针)和sizeof(数组)得到的大小截然不同。
—— C 语言原生态支持两种分配方式,栈分配和静态分配。局部变量(不包括静态局部变量)在栈上分配;全局变量和静态变量
      (加static的变量)是静态分配。并不存在数组(只能)在栈上分配的说法。另外,指针变量(单独说指针容易误解,因为还是指针常量和
常量指针——也就是地址)也是变量,同样存在栈分配和静态分配。最后,堆并不是C语言原生态支持的,而是通过软件和库来模拟的。所以,
指针分配在堆上也是错误的。sizeof(指针)获得的是指针变量本身的大小,sizeof(数组)获得的是数组大小,这是语法规定的,并不因为楼主
说的原因导致的。

       误人子弟!

2. 栈相当于直接寻址,堆相当于间接寻址。一般直接寻址的也能用间歇寻址折腾,因此数组也能被编译器当做指针访问。
——栈只是一个数据结构,和寻址方式基本无关。同样,堆也是一个数据结构,与寻址方式无关。误人子弟。

3. C语言的数组本质上都是一维的,还是定长的,真正的多维数组只能靠指针来实现。
—— 这句话隐含了楼主的一个自己的理解:定长的多维数组不是“真正”的多维数组,只有可以动态修改大小的多维数组才叫多维数组——敢情
楼主从BASIC语言来的吧?误人子弟。
    C语言的多维数组本质上欢迎定长,因为C语言并不原生态支持堆,所以编译器生成的数据类型都必须在编译时刻大小确定,这是为什么
C语言多维数组大小要定长的原因。多维数组也不一定一定只能靠指针数组来实现。具体不再展开。

希望楼主不要传播自己错误的理解。谢谢。

Gorgon_Meducer 发表于 2017-7-10 21:21:21

chenxujiaoyang 发表于 2016-4-30 00:05
好奇心进来看看,看见图片忍不住笑了,图片红色文字说“数组是一个指针常量”,我相信这句话在正规的书本 ...

数组本质上是一个指针常量这句话并没有错,只是不准确。
数组的确本质上是一个指针常量+数组的大小信息和类型信息。

Gorgon_Meducer 发表于 2017-7-10 21:24:34

关于指针的理解,可以参考我的这个帖子

https://www.amobbs.com/thread-5640740-1-1.html

WM_CH 发表于 2017-7-11 10:38:03

Gorgon_Meducer 发表于 2017-7-10 21:17
忍不住要驳斥以下观点——误人子弟:

1. 数组是分配在栈上的,指针是分配在堆上的。只有数组名才会等效 ...

版主出手,此贴终于得到圆满解答!

小弟谨记大师教诲,阿弥陀佛{:lol:}

flyaaa 发表于 2017-8-6 21:32:28

版主理解很深刻,学习了

郭震2009 发表于 2017-8-6 22:10:01

有心人... {:handshake:}

canspider 发表于 2017-8-6 23:08:00

试着去实现一个c语言编译器,就没有这些疑问了

Gorgon_Meducer 发表于 2017-8-14 16:44:29

canspider 发表于 2017-8-6 23:08
试着去实现一个c语言编译器,就没有这些疑问了

估计这个要求超出一般人的能力和可用时间。
而且逻辑其实也不太对,这就好比说“你去制造一辆汽车,就知道怎么开车(修车)了”。

canspider 发表于 2017-8-27 22:21:36

Gorgon_Meducer 发表于 2017-8-14 16:44
估计这个要求超出一般人的能力和可用时间。
而且逻辑其实也不太对,这就好比说“你去制造一辆汽车,就知 ...

要求真不高,计算机专业课的小作业就是设计一个编译器

Gorgon_Meducer 发表于 2017-8-29 19:19:15

本帖最后由 Gorgon_Meducer 于 2017-8-29 19:20 编辑

canspider 发表于 2017-8-27 22:21
要求真不高,计算机专业课的小作业就是设计一个编译器

你看看这里有几个人是计算机专业的?顺便说下,我是软件工程专业的,我做过你说的这个练习。由于我长期叛逃信息控制类专业,我知道他们根本没有对应的课程设置。

canspider 发表于 2017-9-21 21:41:10

Gorgon_Meducer 发表于 2017-8-29 19:19
你看看这里有几个人是计算机专业的?顺便说下,我是软件工程专业的,我做过你说的这个练习。由于我长期叛 ...

所以,有时候你努力想教会别人的一些东西,在另一群人眼里只不过是入门的基础

Gorgon_Meducer 发表于 2017-10-6 16:53:53

canspider 发表于 2017-9-21 21:41
所以,有时候你努力想教会别人的一些东西,在另一群人眼里只不过是入门的基础 ...

觉得是入门知识的人,不是你的受众啊。为啥要在乎呢?真正需要的人才是真正愿意接受你帮助的人。

canspider 发表于 2017-10-9 12:35:09

Gorgon_Meducer 发表于 2017-10-6 16:53
觉得是入门知识的人,不是你的受众啊。为啥要在乎呢?真正需要的人才是真正愿意接受你帮助的人。 ...

我这样来理解的
不管是科班也好非科班也好,要想在码代码这条路上走下去
最后的目的都一致,只是路径不同
科班的先看到远处的山峰然后走过去
非科班的先看到脚下的路,不知不觉走上了山
而你现在做的就是让他们不要迷路,同时在给一根拐杖

Gorgon_Meducer 发表于 2017-10-9 17:13:36

canspider 发表于 2017-10-9 12:35
我这样来理解的
不管是科班也好非科班也好,要想在码代码这条路上走下去
最后的目的都一致,只是路径不同 ...

哈哈,要不要一起来?

zhoust 发表于 2017-10-16 20:07:37

Gorgon_Meducer 发表于 2017-10-6 16:53
觉得是入门知识的人,不是你的受众啊。为啥要在乎呢?真正需要的人才是真正愿意接受你帮助的人。 ...

{:handshake:} {:handshake:} {:handshake:}
页: [1]
查看完整版本: 吊丝整理C语言 数组指针 指针数组