指针疑问

yujian596 2010-04-21 05:18:08
摘抄的,他讲的第二重意义是否正确?why?

声明了一个数组TYPE array[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE[n];第二 ,它是一个常量指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的
...全文
197 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sunday 2010-04-22
  • 打赏
  • 举报
回复
http://download.csdn.net/source/2270813

希望对你有帮助,写得很详细,全是介绍指针的
Sunday 2010-04-22
  • 打赏
  • 举报
回复
上面的应该是正确的,数组名就是一个常量,它代表一个地址常量,指向数组的起始地址
注意,这个数组名被存储在存储器的某个位置,是一个指针常量,当你取a[1]的值时,编译器是这样做的,
先找到a[0]的地址,这个地址与a是相通的,然后*(a+1);就是这样;

在这再给你补充点知识;希望对你有点帮助,呵呵

行指针与列指针
比如:数组a[3][3]

行指针 a &a[0];

列指针 a[0] *(a+0);

Int b[4];//b是列地址

int (*p)[3]; //定义一个行指针,此行指针指向一个有三个元素的int类型数组



关于行指针和列指针的两句话:行指针取*变成列指针,列指针再取*变成数组元素;

数组元素取地址变成列指针,列指针取地址变成行指

赵4老师 2010-04-22
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
yujian596 2010-04-22
  • 打赏
  • 举报
回复
谢5楼和9楼。顶上,希望有更多的高手讲解下。
看了5楼的文章,有一定帮助。但是,我觉得你的论证方式有问题,你要论证数组名不是指针常量,你却从数组名不是指针,也不是常量来论证。指针常量,应该是指针的常量,主体是常量,指针只是修饰的。还有“c和d是自动数组,首地址在编译期是不可知的,因为这样的对象在编译期还不存在”,我有疑问,编译期经过此函数时实际分配了内存的,只是函数结束后释放了。
wade_2003 2010-04-22
  • 打赏
  • 举报
回复
不可以array++ 吧
www_adintr_com 2010-04-22
  • 打赏
  • 举报
回复
++的含义除了返回 array + 1 外还要修改 array 本身,而常量不能修改,所以不能 ++
飞天御剑流 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yujian596 的回复:]
谢5楼和9楼。顶上,希望有更多的高手讲解下。
看了5楼的文章,有一定帮助。但是,我觉得你的论证方式有问题,你要论证数组名不是指针常量,你却从数组名不是指针,也不是常量来论证。指针常量,应该是指针的常量,主体是常量,指针只是修饰的。还有“c和d是自动数组,首地址在编译期是不可知的,因为这样的对象在编译期还不存在”,我有疑问,编译期经过此函数时实际分配了内存的,只是函数结束后释放了。
[/Quote]

你现在一时理解不了是很正常的,原因嘛,一是时间问题;二是受其它书籍的毒害。慢慢来吧,两三年后希望你再回来好好读一下这一章,那时候再重新思考以上这段话。
yujian596 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhuyingqingfen 的回复:]

http://download.csdn.net/source/2270813

希望对你有帮助,写得很详细,全是介绍指针的
[/Quote]
你上传的就是我现在看的。。。我也认为他是个指针常量。。非原文说的常量指针。他指向的数组的首地址是不可改变的,即指针的值是不能修改的,但是对于原文说的类似array++的表达式是错误的,我认为array++的表达式不是错误的,因为只从这个表达式看来,array数组名完全可以当做数组的首地址使用,array++指向数组的下一个元素地址。
ypb362148418 2010-04-21
  • 打赏
  • 举报
回复
那个指针不是常量指针,指针明显可以修改他指向的值,但是的确是有独立的内存空间,数组名不是指针,不过可以转化
飞天御剑流 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cudyiron 的回复:]
引用 5 楼 supermegaboy 的回复:

引用楼主 yujian596 的回复:
摘抄的,他讲的第二重意义是否正确?why?

声明了一个数组TYPE array[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE[n];第二 ,它是一个常量指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数……
[/Quote]

http://blog.csdn.net/supermegaboy/archive/2009/11/23/4855018.aspx
sfd1234 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 supermegaboy 的回复:]
引用楼主 yujian596 的回复:
摘抄的,他讲的第二重意义是否正确?why?

声明了一个数组TYPE array[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE[n];第二 ,它是一个常量指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第……
[/Quote]


绝对的概念错误!
相似不代表相同!
很多老师可能为了怕大家乱,于是就说是相同了!这样不好!
ShaoTch 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 supermegaboy 的回复:]

引用楼主 yujian596 的回复:
摘抄的,他讲的第二重意义是否正确?why?

声明了一个数组TYPE array[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE[n];第二 ,它是一个常量指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组……
[/Quote]

那请问这两个概念应该要怎么表述呢?
我只知道数组名和指向数组指针是不一样的,数组名指向数组第一单元,其值只读,且数组名是存在于进行内存的数据段内,楼主讲义里描述的和我说的是一回事吗?
飞天御剑流 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 yujian596 的回复:]
摘抄的,他讲的第二重意义是否正确?why?

声明了一个数组TYPE array[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE[n];第二 ,它是一个常量指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是……
[/Quote]

错在这两句:

它是一个常量指针

该指针自己占有单独的内存区



彻底的概念性错误。
r11222 2010-04-21
  • 打赏
  • 举报
回复
有什么问题呢?事实就是这样
zwicker 2010-04-21
  • 打赏
  • 举报
回复
array++貌似是可以的啊 指向数组的下个元素的内存区
某某9 2010-04-21
  • 打赏
  • 举报
回复
我感觉正确~
yujian596 2010-04-21
  • 打赏
  • 举报
回复
自己顶个

69,371

社区成员

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

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