一、前言:
1、为什么要使用指针?
变量的普通访问方法:从内存的开头,逐一向后查找。
变量的指针访问方法:根据指针变量的值,直接定位到变量所在内存的位置(地址),大大提高访问效率。
2、指针的理解
先要理解地址和数据,你可以想象有很多盒子,每个盒子有对应的号码,那个号码叫做“地址”,而盒子里放的东西叫做“数据”。
把上面的过程理解了,p和*p的区别就不难解释了。
p是指针变量,用来存放地址,你可以认为是上面所说的盒子的号码,“ * ”是解引用操作符,你可以把它理解成打开盒子,*p就是打开p号盒子,取出里面的数据。
简单来说,p存放的是地址,而*p是让程序去那个地址取出数据。
二、概念:
1、p是一个指针变量的名字,指针变量p的值为指向的变量所在的内存起始地址(编号),如果使用%p来输出的话,它将是一个16进制数,使用%d来输出的话,它将是一个10进制数,两者转换互等。
2、*p表示此指针指向的内存地址中存放的内容(即指针所指向变量的值)。
3、&p就是取指针自身p的地址(即指针变量p所在内存的地址),毕竟指针变量也是变量的一种。
三、实例对比测试:
通过比较p,*p,&p的值,理解指针中各个取值表示的意义。
#include"stdio.h"
main()
{
int a[4] = { 100,200,300 }, *p1 = NULL, *p2 = NULL, *p3 = NULL;
p1 = a; p2 = a + 1; p3 = &a[2];
printf("对比p,*p,&p的值:\n");
printf("p1的值:%d *p1的值:%d &p1的值:%d\n\n\n", p1, *p1, &p1);
printf("p1的10进制值:%d, 变量a[0]在内存中的起始地址(10进制):%d\n\n", p1,&a[0]);
printf("p1的16进制值:%p,变量a[0]在内存中的起始地址(16进制):%p\n\n", p1, &a[0]);
printf("\n\n");
system("pause");
return(0);
}