数据在内存中的存储
如果在程序中定义了一个变量,则在对程序进行编译时,系统会为这个变量分配内存单元。内存的基本单元是字节,一个字节有8位,每一个字节都有一个编号,这个编号就是“地址”。
变量的直接访问与间接访问
直接访问:
程序中通过变量名对变量的访问,实际上是通过变量地址、按照变量的数据类型对相应的内存单元进行操作的。通过变量地址可以找到该变量所占的内存单元。因此可以说,变量地址“指向”变量的存储单元。
例如:
int a; float x; a=872; x=a+28;
程序中定义了整型变量a和浮点变量x,分别占据不同的内存单元。
假设系统分配4000H和4001H两个字节给变量a,系统给x分配4002H、4003H、4004H、4005H四个字节。则变量a的地址为4000H,变量x的地址为4002H。(变量地址仅仅是变量在内存中所分配存储空间的低字节的地址。)除此之外,还必须根据变量的数据类型来确定读写操作的方式。故4000H可以理解为是int型数据的地址,4002H可以理解为是float型数据的地址。
在执行“a=872”时,将872按照整型数据的存储方式写入地址4000H所指向的内存单元,即以int型数据写入了4000H和4001H标识的两个字节的内存单元中。
在执行“x=a+28”时,由于运算符的优先性,先计算”a+28“,这时,从地址4000H按照int型数据读出地址4000H和4001H标识的内存单元中的内容872,然后将872+28的运算结果900按照浮点型数据的存储方式写入4002H、4003H、4004H、4005H标识的4个字节的内存单元中。
间接访问
即变量中存放的是另一个变量的地址。按照C语言的规定,可以在程序中定义整型变量、实型变量、字符型变量,也可以定义一种特殊的变量,它是存放地址的。
通过地址能够找到所需要的内存单元。地址“指向”该变量单元。
指针变量里存放的是地址,将这个地址形象地称为**”指针“**
区分:指针与指针变量:指针是指一个地址,而指针变量是一个存放地址的变量。
指针和指针变量
在程序中”*“表示指向,如果定义变量i为指针变量,那么”*i“就表示指针变量i里面所存放的地址所指向的存储单元里面的数据。
指针变量的定义
指针变量定义的一般格式:
基类型*指针变量名
int *i; float *j;
说明:
- "*"指明是指针类型。
- 变量名是 i和 j,而不是i和j。
- 定义指针变量时必须指明基类型。即int型指针变量i 中只能存放int型变量的地址。float型指针变量j中只能存放float型变量的地址.
- int*i表示定义了一个指针变量i,且这个变量中只能存放int型变量的地址,但是并没有对此初始化。即此时的指针变量并未指向任何一个变量。
- “指针变量的地址"与"指针变量的内容”:指针变量也是变量,是变量就有地址,所以在运行时系统就会为它分配内存空间,所以这是"指针变量"的地址。而指针变量里又是存放变量的地址的,这个变量的地址称为"指针变量的内容"。
指针变量的初始化
int i;*j; j=&i;
- 在编译时,系统会给变量a和变量j分配内存单元。假设给i分配4000H和4001H两个字节,给j分配4002H和4003H两个字节,则4000H是变量i的地址,4002H是变量j的地址。
- 将i的地址放到了变量j中,通过i的地址,j就能找到i中的数据。所以j”指向“了变量i。
- 因为j是指针型变量,只能存放地址,所以一定不能忘了取地址符”&“。
- “*j” 和"j":定义指针变量时 * 只是一个声明,说明这是一个指针变量。但此时并没有对j这个指针变量初始化。 当指定j指向变量i之后,*j和i就完全等同了,可以相互替换。
“内存单元的地址"与"内存单元的内容”
#include <stdio.h> int main (void) { int i,*j; //先定义再初始化 i=3; j=&i; printf("%d\n",*j); //*j表示的是指针变量j中所存放的地址即i的地址所面向的存储单元里的数据即3. printf("%d\n",j); //j中存放的是i的地址 return 0; }
3 1703728
#include <stdio.h> int main (void) { int i=3; int *j=&i; //定义指针变量j并完成初始化 printf("%d\n",*j); printf("%d\n",j); return 0; }
3 1703728
指针变量与指针变量之间的相互赋值
要求:
- 两个指针变量的基类型一定要相同
- 赋值运算符"="右边的指针指针变量一定是初始化过的。
#include <stdio.h> int main (void) { int a=1; int *i,*k; i=&a; \\给指针变量i初始化 k=i; \\将指针变量i的值赋值给指针变量k printf("%d\n",i); printf("%d\n",k); return 0; }
1703728 1703728