变量与变量指针:
变量:
当定义一个变量,系统即赋予其对应的内存空间。变量的数据类型将影响变量得到的内存的大小
如:
int 型变量的字节数为4,因此当定义一个int 型变量时。系统将随机的取4个连续的内存单元作为该变量的存储空间。
比如
int i =100;
float f=2.3;
char c='k';
内存中可能这样给这几个变量分配空间:
这些内存单元都有一个编号,这些编号就是他们的“地址”
比如:
变量c所代表的内存单元的地址为0x20fe13
变量i所代表的内存单元的地址为0x20fe18到0x20fe1B。
而此时,i中存储的数据即是如图那样同时存储在4个内存单元中的。
指针变量:
当定义一个指针变量,系统即赋予其对应的内存空间(32位系统中4字节),指针变量可以认为是用来存储内存地址的变量。
指针变量的定义方法是:
[数据类型] *[指针变量名] ;
注1:给指针变量赋值时可以赋以确定的值,比如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中存储的值。
const对指针变量的影响
代码:
#include<stdio.h>
/*
该程序用于测试const对于变量和指针变量的影响
*/
int main()
{
int i=10,j=20;
/*
以下为const修饰在*号之前的情况
*/
const int *p1=&i;
//该状况的const修饰下的指针变量表示不可用改指针变量修改所指变量
//即若欲*p1=26;则编译出错。
printf("%d\n",*p1);
//const修饰下的指针变量可以改变值,如下,使p指向另一个地址
p1=&j;
printf("%d\n",*p1);
/*
以下为const修饰在*号之后的情况
*/
int *const p2=&i;
//该状况的const修饰下的指针变量表示不可修改指针变量的值
//即若欲p2=&j;则编译出错。
printf("%d\n",*p2);
*p2=26;
printf("%d\n",*p2);
}
结果:
注1:如上代码所示,const对指针变量的影响受const与*的相对位置限制。
注2:当定义数组时,若const int a[]={0,1,2,3,4,5}则表示数组内的每个元素都是const型的元素,原理即以上代码所示。