对程序语言里指针的理解
学了一段时间数据结构,遇到的比较大的问题还是对指针理解,了解指针是什么,但对怎么使用还是有些不太明白,现在学的还可以了,对一些基本的使用没有什么大问题,之前学java时,学到过java里没指针,其实是隐藏了,在c里明显会看到指针,用时需要去声明一个指针变量,而java不会我们一直使用的都是一个具体的引用型变量,在给方法传参时不用去管指针,直接用同类型变量接收就行了,其实形参在接收时接收的就是这个类型变量的首地址了,像
void method(struct a){}
在c里面 a可以是结构体类型 ,在java里a可以是一个类,两个语言对这个方法的处理不一样,c将先创建一个局部产量a,然后将传过来的实参的值复制给a,相当于java里重新new出来一个新的变量,实参地址和形参地址不一致,这个变量内的值和a相等;而java则是将实参的地址传给a,相当于一件东西换个名字继续使用,还是原来的东西,实参和形参地址一致。
再说说我对指针的理解吧,补充点其它东西先,我知道的是计算机里所有数据都是线性排列的,对于计算机自己,它是分不清一段数据是指令还是数据的,它既可以当成数据处理也可以当成指令处理,看人想要它怎么处理了,所以它每次处理时都需要先知道处理数据是数据还是指令以及数据的起始位置以及长度,如果是指令,它会通过调用指令的寄存器通过地址总线找到数据,通过控制总线来表达数据的读或写,然后数据总线用来传输数据。计算机数据以一个byte为单位,一byte等于8bit,一bit就是就是一位了它只能存一个1或则一个0,也就是说计算机一个单位能存的数就是从0000 0000到1111 1111了然后每个byte计算机都会分配一个地址,计算机经过一定处理需要能将每一个地址都能表示出来,这也是内存不能做很大的原因之一吧,因为内存太大,计算机寻址能力不够的话有些内存根本就找不到,用不了。所以说比如一个int类型的数据,我想计算机根本不认识这个东西也不知道怎么处理,之所以我们能用某个语言定义int类型的变量要归功于它的编译器了,就是eclipse这类东西,再说一点计算机其实也不认识java这类东西,它只认只有0和1的代码,还要再说一点,最初人们是使用带洞的纸条来向计算机输入数据的,一个洞表示0或1没有洞则表示另一个数,即使之后使用机器输入0和1但人们也深刻体会到了使用01代码的不方便的不方便,于是第一个语言出来了,汇编语言,它和其它语言不一样的地方在于它和机器语言是一一对应的,也就是说你给一条汇编指令,通过汇编编译器可以翻译成唯一的机器代码,机器可以执行,而像java这样的高级语言计算机其实可以有好多种执行方式所以现在的编译器如ecplise,dev都是通过先将高级语言转换成汇编,再将汇编转换成机器代码(小声嘀咕:软件就是通过将exe文件反编译成汇编破解的)所以说,int类型是通过编译器编译告诉计算机该分配多少空间的,而计算机是不认识这些变量类型的(ps:这些只是根据我知道的推出来的,我可不对的它的正确性负责哦(第四声)),我们想使用某一个变量就需要知道它的起始地址和长度,举个例子吧 int a=10;编译器是怎么处理的呢,就是用a存地址比如地址是2001那么a就是2001而2001只是它的起始地值,也就是这段数据的第一个byte的地址,而int就代表了需要连续读取多少个byte而这些编译器会告诉计算机,这也是为什么不同编译器对同一种语言编译时会有细微差别,因为怎么处理这些代码要看写这个软件的人,语言这东西更像是一种规则,遵守这个规则写代码写出来的代码就是同一种语言。
说回指针,指针其实就是将自己储存的数据当做地址处理的变量,已知a=2001,b=2003如果a,b是普通变量那么编译器理所当然的会把a和b当做普通数据处理就是二千零一和两千零三,但如果a,b是指针类型的,那么当使用a时,那么编译器会将其内容当做地址处理告诉计算机,当处理a时,计算机将a里的2001读取出来当做地址然后根据这个地址去找2001号地址存的内容,然后根据a的类型决定读取多少byte的内容,所以指针也就是这么回事,和普通变量的区别就是它里面的内容是当成普通数据处理还是当成地址处理,而在这基础上我们在了解某个语言是怎么规定指针的使用的就很方便使用指针了。
以上就是我对指针的理解了,期间补充了一些东西,但一些东西并未详细说明感兴趣可以查些资料看看,而且说的这些其实也说明了软件对计算机的重要性,离开软件计算机对我们来说基本无法使用了,因为说到底计算机也就是只会加减乘除了,甚至乘除都是用加减来实现的,更是只认识1和0这两位数,因为电路上只有高电平1和低电平0是稳定的所以说学好软件其实出路也挺好的,只要人们的需求不停止那么世界总是需要去实现这些需求的人的,还有就是平时可以多看点其它方面的书,在哪看到的,在计算机领域多了解点总是好的,即使你感觉平时用不到,但其实它已经在潜移默化的影响你的理解能力了,对于同一个东西或许就是这些东西造成了理解深度上的差异。