1. 指针和指针变量
指针是内存地址。指针变量是用来存放内存地址的变量。
#include <stdio.h>
int main()
{
int a = 10;//在内存中开辟一块空间
int* p = &a;//&操作符取出a的地址
//a占用4个字节的空间,这里是将a的4个字节的第1个字节的地址存放在p中,p就是一个指针变量
return 0;
}
2. 指针类型
int*类型的指针存放int类型变量的地址,char*类型的指针存放char类型变量的地址……
2.1 指针+-整数
指针的类型决定了指针的步长(+-1操作的时候,跳过几个字节)。
int*指针+-1跳过了4个字节,char*指针+-1跳过了1个字节……
2.2 指针的解引用
指针的类型决定了对指针解引用的时候有多大的权限(能操作几个字节)。
int*指针的解引用能访问4个字节,char*指针的解引用能访问1个字节……
3. 野指针
野指针是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。
3.1 野指针的成因
- 指针未初始化
- 指针越界访问
- 指针指向的空间释放
3.2 规避野指针
- 指针初始化
- 小心指针越界
- 指针指向空间释放即使置NULL
- 避免返回局部变量的地址
- 指针使用之前检查有效性?
#include <stdio.h>
int main()
{
int* p = NULL;
//....
int a = 10;
p = &a;
if (p != NULL)
{
*p = 20;
}
return 0;
}
4. 指针运算
4.1 指针+-整数
p+1是指向同一数组中的下一个元素
4.2 指针-指针
指针-指针得到指针之间元素的个数。指向同一块区间的两个指针才能相减。
4.3 指针的关系运算
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
5. 二级指针
int a = 10;
int* pa = &a;
int** ppa = &pa;
a的地址存放在pa中,pa的地址存放在ppa中;pa是一级指针,ppa是二级指针。
|