学习笔记---初识指针

来源:互联网 发布:电脑杀毒清理软件 编辑:程序博客网 时间:2024/04/30 07:39

变量与变量指针:

变量:

当定义一个变量,系统即赋予其对应的内存空间。变量的数据类型将影响变量得到的内存的大小

如:

int 型变量的字节数为4,因此当定义一个int 型变量时。系统将随机的取4个连续的内存单元作为该变量的存储空间。

比如 

int i =100;float f=2.3; char c='k'; 

内存中可能这样给这几个变量分配空间:


这些内存单元都有一个编号,这些编号就是他们的“地址”

比如:

变量c所代表的内存单元的地址为0x20fe10

变量i所代表的内存单元的地址为0x20fe18到0x20fe1B。


而此时,i中存储的数据即是如图那样同时存储在4个内存单元中的

指针变量:

当定义一个指针变量,系统即赋予其对应的内存空间(32位系统中4字节),指针变量可以认为是用来存储内存地址的变量

指针变量的定义方法是:

 [数据类型] *[指针变量名] ;


注:给指针变量赋值时可以赋以确定的值,比如p=&a;也可以赋以空值,比如p=null;

注2:赋值为Null和不赋值有什么区别?不赋值的时候p的默认值是一个随机数,当调用的时候会调用到随机的东西,这样可能会调用到程序有权使用的资源以外的东西。会报错。而赋值为Null之后,p就有了一个特定的值了,因为null在二进制里是有一个特定的量的

注3:指针的值为Null时,指针就叫空指针。指针未赋值时,指针就叫做野指针

注4:在32位平台中,每个指针变量都默认分配4个字节的存储单元,用来存放变量的地址(这个大小是由“寻址空间”决定的)




当希望给一个指针变量赋值:

[指针变量名] = &[变量名];


如果说,变量中存储的是数据。指针变量中存储的就是存储数据的变量的“地址

比如,我们之前定义的变量i是Int型的,那么定义一个存储i地址的指针变量的过程就是:

int *p;p=&i;

注1:(&这个符号叫“取地址”运算符,用于获取变量的地址)

此时,p中所存储的就是i的地址了。

注2:定义一个int 型变量i,i虽然会占用比如:0x20fe18到0x20fe1B的内存单元,但i的地址只用0x20fe18表示(首个内存单元的地址)。执行p=&i;之后,p中存放的是0x20fe18

禁忌1:给未初始化的指针变量赋值。如:

#include <stdio.h>#include <stdlib.h>/*这个程序用来测试给未初始化的变量赋值*/int main(){    int a=10,b=100;    int *p1,*p2;//这里定义完指针变量之后未初始化即去调用    *p1=10;//给p1指向的地址所代表的存储空间赋值    *p2=100;    printf("%d %d\n",a,b);    printf("%d %d\n",*p1,*p2);    return 0;}
参照上面指针变量的注2,因为这个代码调用了不被允许使用的内存,所以程序会报错。

禁忌2:给指针变量赋特定的值(不能用整数给指针变量赋值)。如:

#include <stdio.h>#include <stdlib.h>/*这个程序用来测试给指针变量赋特定的值。*/int main(){    int a=10,b=100;    int *p1,*p2;    p1=0x100000;//设定p1指向特定的内存空间    p2=0x100004;    printf("%d %d\n",a,b);    printf("%d %d\n",*p1,*p2);    return 0;}

参照上面的指针变量的注2,这个代码试图给使指针变量指向特定的内存空间,这是不被允许的。

因为这段内存空间可能已经被其他程序或系统调用,我们的程序不一定有权调用该内存。所以会报错

(这个程序里的两个指针也算“野指针”)。


附:变量值的访问方式:

直接访问:

如:printf("%d",i);

间接访问:

如:int *p;p=&i;printf("%d",*p);

注:*这个符号叫“指针”运算符(或称间接访问运算符),可以获得指针指向的地址的值。因为p中放的是i的地址,所以*p等价于*&i 可以获取到i中存储的值。








0 0