juliusun.com
第 24/50 节 冥河C语言教程
以32位CPU计算机环境为例。我们定义的变量、函数等都存放在内存中。内存中的每个字节都有唯一的一个地址,从0x00000000到0xffffffff。比如某一int类型变量i
它的地址是0x002efccc,由于int类型占用4个字节,所以它占用了内存中的0x002efccc、0x002efccd、0x002efcce、0x002efccf四个字节。
通过变量名内容,在计算机运行过程中,也是利用指针来操作的。接上例,编译器编译时将变量与内存中的某一地址绑定,编译链接成可执行文件后,不存在变量名。也就是将内存地址0x002efccc与变量i绑定,所有源文件中的用到i的地方,用0x002efccc指向内容来替代。从而以我们以为系统是通过变量名来识别内容的。
既然计算机内部也是通过地址来操作的变量,而指针记录的就是变量地址,那么我们当然可以用指针来实现操作变量了。
还需要注意,内存中并不是所有区域都像变量一样,可读可写。系统内存分成多个区域,不同的区别,性质不同。比如通常代码区是可执行的,不能读写。或是常量区只允许读、不允许写。或是0x00000000地址不允许使用等,因此,如果我们的指针乱指,经常会出错。未初始化、错误指针、空指针等是有破坏性的,用指针时小心。
指针可以进行加减运算。接上例,假设我们定义了一个int类型指针变量p指向i:。
p是变量,指向的地址可以改变。当p加1的时候,p会指向下一个int类型变量,由于int类型变量占用4个字节,指向下一个int,指针地址实际上增加的字节数是4,p+=1结果是0x002efcd0,是由0x002efccc + 4运算而来。同样p+=N时p地址实际增加的字节数是N*4。
在操作内存块是用char类型指针非常方便,因为char占用一个字节大小,指针每加1,实际增加的地址字节数也是1,非常直观。而用int类型指针,增加时只会增加4的整数倍。减法同样,p每减1,实际地址减小4个字节。p每减N,实际地址减小N*4个字节。
学习指针,不要为了用指针而用指针。尤其是初学者,为了用指针而用,经常会出现不该出现的错误。不用担心很久不用指针会忘掉,在实际开发时,基本是避不开指针的。