您的位置:首页 > 其它

C指针学习笔记

2014-11-08 14:55 162 查看
C语言和Java各有各的优点,C语言的优点在于可以直接访问到硬件存储地址,而访问硬件存储地址的方法就是指针,指针变量存储这两部分的信息,一部分是变量的存储地址,另一部分则是存储地址中的值。因为C语言可以直接访问数据的内存地址,一些外挂的软件利用这一特点通过直接修改硬件存储单元中的数值来实现外挂的效果,这种使用指针直接访问并修改内存数据的功能是C系列的优点,但也是C系列的缺点,这导致C语言编写的程序在安全性上相对于Java比较欠缺,Java是一种比较安全的语言,通过类的封装,Java不允许用户访问硬件内存,从而无法改变内存中的数值。

1.注意

int a = 10, *pa = &a;

//*pa代表10,而在以上的代码中,*pa = &a的过程是,首先声明*pa指针,之后给指针赋值pa = &a,将int类型的地址赋给指针变量。

2.注意(错误的情况)

char *pa;

pa = 100;

/*

以上的程序在理论上说是可以的,pa为一个指针,pa = 100的过程是给指针变量赋值,100为该指针的存储地址,而非存储值。但这种方法是不正确的,首先当前计算机的内存地址的格式不一定类似与100,也就是说当前计算机的内存地址中没有100这个地址,这样会造成程序奔溃,其次,将一个确定的地址直接赋给新声明的指针,就会有这样的风险,当前地址中已经存储有其他的数值,而此地址又被强行占用,这样对数据的安全性带来了很大的影响,该地址中存储的原来的数据就可能被修改。

*/

3.注意(错误的情况)

int *pa;

*pa = 10;

/*

以上的过程看似是声明了一个指针变量,然后将该指针变量中存储整型数值10,但此程序在运行之后会奔溃,其原因是指针在声明之后并未给它分配确定的内存地址,而 int a = 10, *pa; pa = &a;的过程是声明并给整型变量a赋值,同时系统会自动在内存中为这个整型变量10开辟一块内存空间,也就是说这个过程中设计了一个内存地址,是在整型变量a被声明的时候由系统自动分配,而在指针变量声明的时候,系统不会给指针变量分配存储地址。

*/

4.对于3,一下的程序是正确的

int *pa;

int a;

pa = &a; //此处是将int变量的地址赋给了指针变量pa

*pa = 10; //访问并修改指针变量的存储空间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: