一.什么是指针
二.指针和指针类型
三.野指针
四.指针运算
五.指针和数组
六.二级指针
七.指针数组
1.什么是指针:
指针理解的两个要点:
1 : 指针是内存中一个最小的单元的编号,也就是地址。
2 :平时口头语说的指针,通常指的是指针变量,是用来存放内存地址的变量。
总结:指针就是地址,口头语说的指针通常指的是指针变量,
指针变量:
我们可以通过&(取地址操作符)取出变量的内存地址,把地址可以存放在一个变量中,这个变量就是指针变量。
总结:
指针变量,用来存放地址的变量 (存放在指针中的值都被当成地址来处理)
一个小的单元到底是多大?(1个字节)
在32位机器上,地址由32个0或32个1组成的二进制序列,那地址就得用4个字节的空间存储,所有一个指针变量大小是4个字节
在64位机器上,地址由64个0或64个1组成的二进制序列,那地址就得用4个字节的空间存储,所有一个指针变量大小是8个字节
总结:
指针的在32位平台是4个字节,在64位平台是8个字节
2.指针的类型:
char
*
pc
=
NULL
;
int
*
pi
=
NULL
;
short *
ps
=
NULL
;
long
*
pl
=
NULL
;
float *
pf
=
NULL
;
double *
pd
=
NULL
;
char* 类型的指针是为了存放
char
类型变量的地址。
short* 类型的指针是为了存放
short
类型变量的地址。
i
nt* 类型的指针是为了存放
int
类型变量的地址。
指针的解引用:
3.野指针:
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
3.1野指针成因:
1.
指针未初始化
2.
指针越界访问
3.
指针指向的空间释放
3
如何规避野指针
1.
指针初始化 如果不知道初始化什么值,为了安全,初始化为NULL(int *p=NULL)
2.
小心指针越界
3.
指针指向空间释放,及时置
NULL
4.
避免返回局部变量的地址
5.
指针使用之前检查有效性
4.指针运算:
指针
+-
整数
指针的关系运算
指针
-
指针
数组和指针:
结论:
数组名表示的是数组首元素的地址
。(2种方式除外,sizeof(数组名),&数组名)
sizeof(数组名):数组名单独放在sizeof内部,数组名表示整个数组,计算的是数组的大小,单位是字节
&数组名:数组名表示整个数组,取出的是整个数组的地址,数组的地址和数组首元素的地址,值是一样的,但类型和意义不一样
那么这样写代码是可行的:
int
arr
[
10
]
=
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
0
};
int *
p
=
arr
;
//p
存放的是数组首元素的地址
既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能
所以
p+i
其实计算的是数组
arr
下标为
i
的地址。
那我们就可以直接通过指针来访问数组。
二级指针:
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?
*ppa
通过对
ppa
中的地址进行解引用,这样找到的是
pa
,
*ppa
其实访问的就是
pa
.
int
b
=
20
;
*
ppa
= &
b
;
//
等价于
pa = &b;
**ppa
先通过
*ppa
找到
pa
,
然后对
pa
进行解引用操作:
*pa
,那找到的是
a
.
**
ppa
=
30
;
//
等价于
*pa = 30;
//
等价于
a = 30;
指针数组:
指针数组是指针还是数组?
答案:是数组。是存放指针的数组。
数组我们已经知道整形数组,字符数组
int
arr1
[
5
];
char
arr2
[
6
];
那指针数组是怎样的?
int*
arr3
[
5
];
//
是什么?
arr3
是一个数组,有五个元素,每个元素是一个整形指针。