一下午没写出一个程序,现在还要用一晚上帮妹子翻译一篇论文
longshaoye
2013/9/7 8:07:22
指针链表毫无难度。。。
指针本身就是个地址,长度等于地址总线位数的一个二进制数,标志着一个结构或者变量或者对象在内存中的位置,所有指针无论什么类型,内容都是一种东西,他的类型的作用是告诉编译器这个地方的内存是怎么分配的。前面不加星号就是一个纯二进制数,加上星号就是这个地址上的内容用这种类型的解读方式得到的值。加几个星号就解几次。
链表就是不断地指向下一个结构的一个整体。。真没啥讲的。。。注意好内存分配就行。。。c用malloc函数进行分配,一般来说是匿名内存不断增长的方式。。。至于每个结构存在哪里无关紧要。
指针的声明就是告诉编译器这是个指针,于是编译器分配32位或64位的内存空间给指针,保存目标的地址。。。就这。。。实际上我觉得用long就可以保存指针了。。当然我没试过。。。实际上程序语言,特别是强类型语言的类型,作用就是告诉编译器内存如何分配,在编译出来的二进制文件或者说机器码里面,是压根没有类型这种东西的。当然,涉及到有重载的c++的时候,类型还是存在的,用来标识函数的参数类型,比如在机器码里面,c++函数的名字就是function_int_int这种,用来实现重载的,c里面就不会带上参数列表,因为没有重载,不需要。
其实从原理讲对任何64位或者32位都可以进行解引用操作,视系统位数而定。不过编译器可能会有高端的检查方案,具体有没有我也没试过。至于指针为什么要出现,一方面是数据结构的需求,复杂结构的连接都需要指针。其实计算机在内存中获取数据,本身就是通过寻址方式完成的。第二就是c类语言,参数传递有传值和传址之分。你把一个变量或者变量集合当作参数传进去,函数的操作是在复制的一个变量或者变量集合上进行的,操作完你会发现原变量或者变量集合没有变化,因为你在形参列表里面声明了一个新的玩意,所以函数是在对你声明的新东西进行操作的。这时候就需要地址,你对地址解引用进行操作,就是你对这个内存上的东西进行操作。所以让你写个函数对变量或者变量集合比如数组做一个排序啊或者别的修改操作,千万要传地址。同时涉及到变量集合的操作请千万用指针当参数,因为用值当参数要造成大量的内存占用,且读取速度也并不比内存直接寻址来的快。
其实语言本身不难,难的是以这种语言位基础建立的数据结构。你们看的教材太渣了,没有从编译型语言的根本,就是计算机的寻址方式和执行方式上讲解。知道是怎么执行的就简单了。本质就是从内存里面找出数据然后进行计算,存储。每一个变量声明其实都是对内存的分配过程,至于变量名什么的就是告诉编译器你要找的数据放在哪的,是给编译器看的,程序编译完成后这些名称都是没有的,所有编译语言都是跟地址紧密相关的,比如数组的名字,本身就是指针,指向这个数组的第一个元素。所有类型的作用都是告诉编译器这个结构所处的内存是怎么分配的,指针就是给了你们自由寻找内存的方式,你对指针随便赋予一个能容纳的值,都可以因此寻找出这个地址上的内容。指针本身,就是地址。
专业计算机的表示周围一群大神就我一个渣至今为止感觉指针链表神马的还是难以理解。。。