在当今计算机中,一般以一个字节作为一个内存单元。给每个内存单元分配一个编号,称为内存单元的地址。
按照数据类型的不同,分配的内存单元的数目也不同。eg:int型数据占4个内存单元,char型占一个内存单元。一个变量所占用内存的首地址,称为该变量的地址。而一个变量的地址也称为该变量的指针。
int a;
char ch;
对这两条语句,假设C编译程序给出如图所示的内存分配形式。
此处,int型变量a占用以2009开始的四个单元(即2009~2012),char型变量ch占用地址2013对应的一个单元。一旦为变量分配了内存单元,对变量的操作实质上就是对其内存单元的操作。
a=100;
ch='A';
上述两条语句实现的功能是:将整数100存入到以地址2009开始的4个内存单元中,将字符常量A存入到地址2013对应的1个内存单元中。结合图示。此时变量a的地址是2009,内容是整形常量100;变量ch地址是2013,内容是字符常量'A'。
指针变量用来存放另一个变量的地址。
定义指针变量的一般形式为:
类型说明符 *变量名(其中的“*”表明变量是一个指针变量,而“类型说明符”则是该指针变量所指向的变量的数据类型。);
eg:int *p;
float *q;
此处定义p为指向int型的指针变量,只能存储int型变量的地址。定义q为指向float型的指针变量,只能存储float型变量的地址。
获取变量的地址示例
#include<stdio.h>
main()
{
int i,*p; /*定义一个指针变量*p 也可以定义为 int i,*p=&i;*/
p=&i; /*"&"为取地址运算符。功能是获取紧随其后的变量的内存地址。本条语句表示将变量i的地址赋给指针变量p*/
printf("p=%p\n",p); /*%p用于以十六进制形式输出地址值*/
}
此程序的运行结果不是一成不变的,因为变量i的内存空间是随机分配的。
通过间接引用方式交换整型变量的值
#include<stdio.h>
main()
{
int a,b,t;
int *p1,*p2;
a=100;
b=10;
p1=&a;
p2=&b;
t=*p1; /*此句等价于t=a;*/
*p1=*p2; /*此句等价于a=b;*/
*p2=t; /*此句等价于b=t;*/
printf("a=%d,b=%d\n",a,b);
printf("*p1=%d,*p2=%d\n",*p1,*p2);
}