数据类型:
基本数据类型
构造类型(数组类型)
指针类型
指针:1.所谓指针,其实就是地址,地址是内存单元的编号
(理解:指针(地址)---作为内存单元的编号,本身也是一种数据,但是这种数据含义比较特殊)
int a = 0x1000;
&a; //0x1000(取地址)
2.指针还是一种数据类型
专门用来,保存,地址(内存单元的编号),这种数据的,数据类型
指针--->内存单元的标号--->一块内存空间对应
指针变量的定义:
语法:基类型*指针变量名
(1)(2)(3)
(1)基类型---表示地址编号所代表的那块空间中要存放的数据的类型
//表示的p中存放的 地址编号所代表的那块空间中要存放的数据的类型
(2)* ---表示定义的变量,不是一般变量,而是指针类型的变量
指针类型变量,意味着这个变量将来是存储地址这种数据的
(3)指针变量名---标识符,命名规则与变量名命名规则一致。
int a;//表示定义了一个int类型的a,a是一个变量,一定对应有一块空间
int * p;//表示定义了一个指针类型的变量p
//既然是变量,则p一定有自己的一块空间
//这块空间是用来存放 地址这种特殊的数据的
//p指向的数据类型是int类型 //p指向的类型是基类型(目标类型)
//p变量,可以存放的是int类型的地址
//指针是一种数据类型 ,p是int型的指针(地址)类型
例:
int a = 10;
int *p = &a; //从p的角度看,我们说p指向了a
float a = 10.1;
int *p = &a; //此时编译会报警,因为左右两边类型不一致,p是int*
//int*表示是一个存放int类型数据的空间的地址
//a是一个float类型的变量,&a表示获得了这块空间的地址,这个值的类型是float*
通过指针访问数据:
* //单目运算---运算数必须是地址值
//作用:
//*地址值=>访问到了地址值对应的那块空间
//eg:
//相当于酒店中知道了门牌号并且拿到了钥匙,可以进入房间
有了指针之后:
通过a变量名方式访问,这种直接访问
通过p指针方式访问,这种间接访问
int a = 10;
int *p = &a;
printf("a = %d\n",a);//直接访问
printf("*p = %d\n",*p);//间接访问
int *p = &a;//p的基类型是int(看的是这行开头的int的类型)
*p运算:
step1:首先,拿出p中的值,到内存中定位
step2:定位到之后,从定位处开始,偏移出sizeof(基类型)的一块空间
step3: 将这块空间当做一个基类型的(变量)来看
注意:所以*p整体相当于是一个基类型的变量a
为什么需要指针?有些时候,不使用指针,没有办法达到想要的效果!
指针的核心用途:(被调修改主调)
使用方法:
1.要修改谁,就把谁的地址传出去
2.一定要对其做*运算
指针的初始化:
int *p;//
野指针(没初始化)//指向不明确的指针
int *p = NULL;//NULL是编号为0的这个地址
总结:
1.指针
2.指针变量定义
基类型*变量名;
3.指针变量的引用
*指针变量名
*p//理解三步运算过程
4.指针的初始化
如果指针未初始化,此时指针变量中是个随机的地址,被叫做野指针
为了让指针变量有明确的值,
int a = 10;
int *p = &a;
int *p = NULL;
5.应用
被调修改主调
使用方法:
a.要修改谁,把谁的地址传过去
b.被调函数中,一定要有*运算
--------------------------------------------------------------
指针+数组
指针+函数
指针+指针
---------------------------------------------------------------
指针 操作 数组
int a[10] = {1,2,3,4,5,6,7,8,9,10};
数组名 ---代表值---首元素的地址(只要知道首元素的地址了后面的地址就都能推出来来)
&a[0]//a[0]的数据类型是int型
//&a[0]的地址类型是int*型
int *p = &a[0];//定义一个指针变量来存放数组首元素的地址
int *p = a;//a<=>&a[0] 和上一行意思一样
// 可以说p指向了数组a
printf("*p = %d\n",*p);
指针访问一维数组
*(p+i)<=> a[i] //等价 数组下标访问 本质上
指针的运算:
p+N //指针+数字
//含义:表示指向了第N个元素的位置
//数值上看,sizeof(基类型)*N
总结:&a[0] 和 *a等价