//指针
//内存中的每个数据 都有一个编号,找个编号叫做内存地址.
//指针就是内存地址.
//指针是一种数据类型.
//指针变量
//存放内存地址的变量 叫做指针变量
//定义 指针变量的语法
//指针类型 变量名=值;//注意值必须是地址.
//示例:
// int *p=NULL;
//类型是 int *
//变量名是 p
// 值是nulll.null是内存地址0,即二进制的32个0(32位操作系统)或者64个0(64位操作系统).
//注意区别 基本数据类型和 指针类型.
// int a=10;
// printf("%p\n",&a);// &是取地址符,主要功能,获取一个变量的地址. 打印地址,使用%p
//
// float b=3.14;
// printf("%p\n",&b);
//
// p=&a;
// printf("%p\n",p);
//如果 p存放的是&a
//那么 *p就是a,对*p操作就是对a操作.
//同理,如果 p存放的是&b
//那么 *p就是b,对*p操作就是对b操作.
//指针变量用于存放 内存地址.
//一个内存单元(一个字节) 对应一个内存地址.
//一个整形数据 4个字节 ,也就意味着对应4个内存地址.
//指针变量 存放的是哪个内存地址呢?
//指针变量存放的是变量的首地址.
int a[5]={1,2,3,4,5};
//数组在内存中是一段连续的存储空间.存储空间的大小等于单个元素所占空间大小乘以元素个数.数组a所占空间就是20个字节.也就意味这回有20个内存编号.
//数组名a本质上是一个地址,数组首地址(也是数组第一个元素的首地址).
printf("%p\n",a);//a本身已经是地址,不需要加&
printf("%p\n",&a[0]);
printf("%p\n",&a[1]);
printf("%p\n",&a[2]);
int *p=a;
*(p+1)=100;
printf("*p=%d",*(p+4));
for (int i=0; i<5; i++) {
printf("%d ",*(p+i));
printf("%d ",a[i]);
}
//a[0] *(p+0) p[0] *(p+0)
//a[1] *(p+1) p[1] *(p+1)
//a[2] *(p+2) p[2] *(p+2)
//a[3] *(p+3) p[3] *(p+3)
//...
//a[i] *(p+i) p[i]
//可以得出一个结论,*(p+i)对应数组下标为i的元素
//数组名 代表的是 数组的首地址.简单来说 数组名是地址
//指针变量 是存放地址的变量. 简单来说 也是地址.
//因此 *(p+i) 可以模仿a[i],写成p[i].
//同样 a[i]可以模仿 *(p+i) 写成 *(a+i)
printf("\n");
printf("%d %d %d %d",a[1],*(p+1),p[1],*(a+1));//四种形式等价