1指针理解
指针是什么,能干什么
指针去操作变量
指针操作数组及数组元素shu
指针操作结构体
全名:指针类型
理解变量的值:根据需要的数据类型定义的变量,分配的内测分配的空间所写入的值
理解变量的地址编号值:
定义变量时,空间会分配相应的编号的地址空间,此变量的地址编号值为分配的空间的首字节地址编号的值
理解指针:指针类型是一种数据类型,用指针类型定义的变量叫指针类型变量(指针变量)(指针)
指针类型变量是用来存地址编号值的
2分析指针要素
2.1给出一个指针变量能分析出他的要素
int *p;这是一个指针类型的变量(本质是一个变量)(是一个可以存地址编号的变量)
分析:变量名:p 变量名的类型:int * int 指向对象类型
说明:这是一个指针类型,可以用来存储地址编号的,可以存整型变量的地址编号
//指针类型: 除了变量名以外的内容就是变量名的类型
int (*p)[10] 变量名 :p 变量名类型 int (*)[10] 指向对象的类型int [10]
int(*a) (void) 变量名:a 变量名类型 int(*) (void) 指向对象的类型 int (void)
int **p 变量名:p 变量名类型 int ** 指向对象的类型 int *
//指向对象的类型 : 除了*和变量名意外的内容 就是指向对象的类型
举例 int a[]; 变量名:a 变量名的类型:int []
2.2 根据指针需求定义指针变量
格式:指向对象类型 *变量名;
说明:定义指针类型变量,根据需求选择确的指针类型,然后根据格式定义
举例:
int a; int *p; p=&a;//p存a的地址
int *m; int **p; p=&m;//px存m的地址
说明:指针变量p存储了变量a的地址; ==可以说指针变量p指向了变量a;
指针变量存了谁的地址,就是指向了谁
3指针的使用
3.1 先定义一个符合要求的指针
明确指向(存了一个变量的地址)%x
3.2 &:取地址符 *:取空间内容符
int *p;
printf(“p:%d\n”,p); //p里存储的值,
printf(“*p:%d\n”,*p);//p里存储的值所代表的地址空间的编号
printf(“&p:%d\n”,&p);//p的地址
注意: int *p 定义语句中,*可以理解指针的标志
printf(“p:%d\n”,*p);中的* 是取内容符号
int *p;
int a=10;
p=&a;
*p=20; //*p取出a的值,将其改为20
printf(“*p:%d\n”,*p); //20
printf(“*a:%d\n”,a); //20
3.3指针变量占用空间的大小
关键字:
功能:计算对应类型的变量占用空间的大小(字节)
sizeof(变量名/变量名的类型)
看平台依据是32位,还是64位的,dev默认64
常用的为32位的,此时指针变量占4字节
64位的,指针变量占用8字节
指针变量占用空间大小,与所指的类型没有关系
指针变量的本质是:存储地址编号
所有的地址编号都是二进制32位的数据,32位就是4个字节。
3.4指针移位
说明:指针移位就是指针变量的增减
指针变量的移位后的结果,跟指向对象的类型有关
int a=10;
int *p;
char *q;
p=&a;
q=p; //p存的地址给q,同时指向同一块空间,可以这样写不要这样用
#include <stdio.h>
{
int a=10;
int *p;
char *q;
p=&a;
q=p;
//假设地址是0x1234578
printf(“*p:%x\n”,*p);//12345678
printf(“*q:%x\n”,*q);//78
// char 一个字节,只能是首字节,int 可以是四个字节
p=p+1;
q=q+1;
printf(“*p:%d\n”,*p); //+4
printf(“*a:%d\n”,*q); //+1
printf(“*p:%x\n”,*p);//垃圾值
printf(“*q:%x\n”,*q);//56
//int *型移动一步,p指向偏移+4;char型移动一步,q偏移+1
}
指针移位跟指向对象的数据类型有关
int * +4
char * +1
short* +2
double * +8
补充:
p+1; //p存储的地址不变2017 (p+1)整体2021
p++;//p存储的地址变成2021