定义一个整形指针p:
int *p;
- p:p是一个变量,但它与普通整型变量不同。普通整型变量一般用来保存一个数值,p 保存的也是一个数值,但这个数值代表地址,这个地址可以改变。
- *p:*p是取p对应的地址里的数据 。
- &p:因为p是一个变量,所以就要有内存空间来保存这个变量,这就是&p,&符号代表取地址。
我们进行如下操作:
#include "stdio.h"
int main()
{
int i;//定义循环变量
int a[] = {1,3,5,7,9};//定义一个数组
int *p = a;//将指针指向该数组
printf("数组 a 的地址为 %p\n", a);//输出数组a的地址
printf("存放 p 的地址为 %p\n", &p);//输出&p,也就是存放指针p的地址
for(i = 0; i < 5; i++)
{
printf("%p 地址存放 %d\n", p, *p);//输出数组的每个元素及存放该元素的地址
p++;
}
printf("\n");
return 0;
}
运行结果:
从运行结果来看,在内存中有这样一块区域:
地址 | 数据 | 地址 | 数据 | |
---|---|---|---|---|
0019FF00 | 0019FF18 | 1 | ||
0019FF04 | 0019FF1C | 3 | ||
0019FF08 | 0019FF20 | 5 | ||
0019FF0C | 0019FF24 | 7 | ||
0019FF10 | 0019FF28 | 9 | ||
0019FF14 | 0019FF18 | 0019FF28 |
其中0019FF14为存放指针变量p的地址,也就是&p=0019FF14。
该地址的数据为0019FF18,也就是p=0019FF18,找到与该数据相同的地址,在右侧第一行,该地址的数据为1,也就是*p此时=1。
之后每次循环p++,由于p是整型指针,所指向的数据占4字节,编译器会对+的变量乘以4,也就是每次+4,这样对0019FF18地址+1结果指向0019FF1C,以此类推。