本来一切都安好的, 听唐老师讲了幾节指针的课, 发现有很多问题过去并不是很清晰啊, 还有一些认为想当然的问题也遇到了挑战. 最近做笔记比较少. 写下本文权当笔记吧!
前几天唐老师一直讨论的指针是无符号还是有符号数也是比较郁闷, 我问了下小浩, 他说指针应该是无符号的, 不然就不能够指向内存的高2G. 我觉得这个說的很有道理, 另外一个我自己在比较两个指针的时候发现用的是JA, JB所以我也断定这个指针应该内部当做无符号来对待的,但是唐老师提到两个指针做减法的问题, 他说两个指针在做减法的时候再和某个数比较的时候用的却是有符号.
具体这个东西是有符号还是无符号的, 觉得只能让写編译器的人给个答案了!
另外昨天也接触到指针的一个特殊用法, 我倒. 以前居然从没有见过. 类似于这种形式:
原来对于这个指针数组还是有点明皛的, 但是对于这个用一个指针指向数组, 然后数组里面存放的又全是指针, 这个应该叫什么?指针的指针数组?? 以前也没有见过哪里使用过这种语法! 另外我咋一眼看上去觉得这个东西应该是数组, 然后发现其只是一个指针.指针而已. 占用4个字节空间.
今天早上唐老师又拿了几道题目过来测試, 反写汇编代码, 使我大受打击, 我倒.. 这边就贴代码, 然后跟着代码注释. 以前没有来这边一直没有用过3个*的变量, 来这边以后我倒, 起步价5个*… 也不知道用没有用处!
这边是c语言中32位和64位什么意思代码. 看看反汇编出来的都是什么东西:
总共两个函数了. 看看两个函数反汇编出来的结果:
; 这里这個问题一直是我以前所困扰的, 我以前一直认为*p++是p所指向的内容++
; 但是很明显也是加了240, 主要的问题只有一个, 就是++的运算符级别比*高,
; 所以要先和++結合, 剩下的就和我们声明的int变量 a++一样了..
; 那么或许我们换成这种形式可以看更清楚一些.前面这种是全*访问,
; 后面这种才是应该的正统访问方式
; 所以以前认为[]和*没有理解好, 虽然这里每种方式都可以访问, 生成的汇编
; 代码也是一样的, 但是自己要注意区分, 这里的3, 4, 5都是属于数组的, 前面的
; 2是屬于*p的, 其大小就是整个的数组大小.
; 那么这句代码其实是这种形式了.
; 所以计算出来应该是这样的
; 这里再一次证明了数组只是一个指针名称, 传遞参数里面.是没有数组的!
; 当然这里是一句废话, *&同时出现是会抵消的, 所以其实是这句
; 这里是代码有少量优化的效果, push ecx而不用sub esp, 4这句上面代码有体現
;这里是以前正常的把带*参数当成数组来用的例子, 其实是这种形式
;其实下面这个表达式才是正统的写法.
;主要就是要区分好数组和指针之间嘚关系, 虽然可以套用. 但是自己心里一定
;要明白.目前是什么..