关于指针与数组的一点感悟

    本着着数据结构是王道的原则,狠下心来闭门修炼,刚着手约瑟夫循环的时候就遇见一点指针方面的理解障碍,看来功力确实不足。简单抽象出来的代码如下:

 

    编译没问题,运行就崩溃。本来觉得数组跟指针既然没多大区别,那定义了*a,自然就可以用a[i]来引用。尝试把*a换成a[256],运行,没问题。问题锁定在*a的定义上面。半天没想法,问了下呵呵,他说*a定义时并没有给后面的内存分配空间,而a[256]就明确指定了空间大小。一句话醍醐灌顶,内存不够了。想了一下,觉得定义a[]和*a直观上感觉是一样的效果,事实也确实如此,而*a却能逃过编译器的眼睛,a[]就成了bug。

    问题虽小,思想原创。想了一下内存泄漏,内存溢出跟指针悬垂的问题,都是关于内存空间分配与使用的问题,而这些问题往往不像逻辑错误能够简单识别,只能再摸索中前进。

    关于指针,最近在如鹏上看到一篇文章,确实短小精悍,值得思考一下:

 

简单想了一下,自然觉得输出2 1,粘下来运行,傻了,5 2。看了解释后才明白,&a与a值是一样的,都是存放a[0]的地址,而代表的意义不同,&a指向一维数组的地址,即整个a这这片内存,故ptr = &a+1即为横向指针加1,指向a[4]后面一个地址,其实也就是二维数组中的行指针。这段代码似乎没有一点二维数组的影子,而真正重点在于行指针。如果将(int*)(&a+1)改为a+1,输出结果就变成了2 1。

    觉得有点意思。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值