系统给虚拟内存的每个存储单元分配了一个编号,从 0x00 00 00 00 ~0xff ff ff ff
这个编号咱们称之为地址
指针就是地址

指针变量: 是个变量,是个指针变量,即这个变量用来存放一个地址编号 在 32 位平台下,地址总线是 32 位的,所以地址是 32 位编号,所以指针变量是 32 位的即 4
注意:
1.无论什么类型的地址,都是存储单元的编号,在 32 位平台下 都是 4 个字节, 即任何类型的指针变量都是 4 个字节大小
2. 对应类型的指针变量,只能存放对应类型的变量的地址 举例:整型的指针变量,只能存放整型变量的地址
扩展:
字符变量 char ch=‘b' ; ch 占 1 个字节,它有一个地址编号,这个地址编号就是 ch 的地址 整型变量 int a=0x12 34 56 78; a 占 4 个字节,它占有 4 个字节的存储单元,有 4 个地址编号。

指针变量的定义方法
1.简单的指针变量
数据类型 * 指针变量名;
int * p;
//定义了一个指针变量 p在 定义指针变量的时候 * 是用来修饰变量的,说明变量 p 是个指针变量。
变量名是 p
2.关于指针的运算符
& 取地址 、 *取值
例 1:
int a=0x1234abcd;
int *p;//在定义指针变量的时候*代表修饰的意思,修饰 p 是个指针变量。
p=&a;//把 a 的地址给 p
p 保存了 a 的地址,也可以说 p 指向了 a
p 和 a 的关系分析:a 的值是 0x1234abcd,假如 a 的地址是:0xbf e8

int num;
num=*p;
分析:
1、在调用的时候 *代表取值得意思 ,*p 就相当于 p 指向的变量,即 a, 2、故 num=*p 和 num =a 的效果是一样的。 3、所以说 num 的值为 0x1234abcd。
扩展:
如果在一行中定义多个指针变量,每个指针变量前面都需要加*来修饰
int *p,*q; //定义了两个整型的指针变量 p 和 q
int * p,q; //定义了一个整型指针变量 p,和整型的变量 q
#include<stdio.h>
int main()
{
int a = 100;
int b = 200;
int *p1,p2 = &b; //表示该变量的类型是一个指针变量,指针变量名是 p1 而不是*p1.
//p1 在定义的时候没有赋初值,p2 赋了初值
p1 = &a; //p1 先定义后赋值
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n",*p1);
printf("%d\n",*p2);
return 0;
}

注意:
在定义 p1 的时候,因为是个局部变量,局部变量没有赋初值,它的值是随机的,p1 指向哪里不一定,所以 p1就是个野指针
指针大小
//在 32 位系统下,所有类型的指针都是 4 个字节
#include <stdio.h>
int main()
{
char *p1;
short int *p2;
int *p3;
long int *p4;
float *p5;
double *p6;
printf("%d\n",sizeof(p1));
printf("%d\n",sizeof(p2));
printf("%d\n",sizeof(p3));
printf("%d\n",sizeof(p4));
printf("%d\n",sizeof(p5));
printf("%d\n",sizeof(p6));
return 0;
}

示例:
#include <stdio.h>
int main()
{
int a=0x1234abcd;
int *p;
p=&a;
printf("&a=%p\n",&a);
printf("p=%p\n",p);
return 0;
}
