C语言指针理解----p,*p,&p的区别

时间:2024-04-11 09:54:17

一、前言:

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的值,理解指针中各个取值表示的意义。

C语言指针理解----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);

}