一.什么是指针
1.1 了解地址
我们的电脑都有内存,电脑内存有是8G, 16G或者32G等等,每个内存单元读取单位大小是1个字节,每个字节在内存都有对应编号,每个编号又对应每个地址,而c语言中的地址又叫指针,所以地址对于指针。
1.2 理解地址
知道什么了是地址,地址又有什么作用呢
int main()
{
int a = 0;
return 0;
}
我们创建变量 a 就是向内存申请一块大小为4个字节的空间来存储整数0,
既然是存储在内存中那我们是可以看到的。
我们打开调试功能,在监视那添加 &a我们就是可以看到 a 的地址
是16进制:0x000000cbde35f934
2.1 取地址操作符 &
&a 旁边的 & 是取地址符号可以取出 a 在内存中的地址
同样我们可以用函数 printf 打印出来看看
我们每次创建变量向内存申请的空间是不一样的,所以这里变量 a 的地址是和上次看的地址是不一样的。
2.2 指针变量
把地址取出来有什么用呢,把地址取出来可以存到指针变量中
int main()
{
int a = 0;
int* p = &a;
//这里我们创建了指针变量 int* p ,然后我们把变量 a 的地址放到了指针变量 p 里面。
//现在 p 里面存储了 a 的地址。
//我们可以打印看看地址是不是一样的.
printf("%p\n", &a);
printf("%p\n", p);
return 0;
}
运行结果 a 地址已经存到了 指针变量 p 中了。
我们可以把指针变量理解成,就是一个存放地址的变量。
指针变量 int* p ,p 的左边 int* 表面了他是个指向 int 类型的指针.
//同理,我们创建了一个 char 类型的变量想把 char 类型的地址放入指针变量中
//我们也要创建一个 char* 类型的指针变量
char a = 0;
char* p = &a;
2.3 解引用操作符 *
既然我们把 整型变量 a 的地址存储到了 整型指针变量 p 里面那我们通过地址找到的就是 a
那我们怎么把 a 里面的值拿出来呢
这时我们就要用到解引用操作符 *
int main()
{
int a = 0;
int* p = &a;
int b = *p;//这里我们用解引用操作符把 a 的值存到了 b 里面
printf("%d\n", *p);
printf("%d\n", b);
return 0;
}
分别打印 *p 和 b 的值我们发现都是一样的
3.1 指针变量的大小
指针变量也是有大小的,指针变量的大小和指针变量的类型无关,只会和平台有关系,
在32位下指针的大小为4个字节,在64位下指针的大小是8个字节。所以指针变量的大小分为4/8字节。
3.2 指针变量的类型
指针的类型决定了,对指针解引用一次所能访问的字节个数
char* 类型的指针只能操作一个字节,而 int*类型的指针能访问4个字节。
int main()
{
这里定义了俩个指针类型一个char*, 一个int*
把 n 的地址分别传个俩个指针变量
看一看俩个指针加一的效果
int n = 1;
int* pi = &n;
char* pc = (char*)&n;
printf("n = %p\n", &n);
printf("pi = %p\n", pi);
printf("pi + 1 = %p\n", pi + 1);//int 类型加1是加4个字节大小
printf("pc = %p\n", pc);
printf("pc + 1 = %p\n", pc + 1);//char 类型加一是加一个字节大小
return 0;
}
3.3 void*类型指针
指针类型中又一种特殊的指针类型 void* ,可以接受任意类型的地址,可以理解为无具体类型的指针。但 void* 也有局限性无法进行±整数运算,和解引用的运算。
4.1 const修饰指针
const 修饰 * 左边
int main()
{
int n = 0;
int m = 10;
const int* p = &n;
*p = 10;
return 0;
//const修饰 * 左边后我们不能通过解引用来修改指针所指向的内容
}
但是通过修改指针所指向的地址,可以改变指针所指向的内容
const 修饰 * 右边
int main()
{
int n = 0;
int m = 10;
int* const p = &n;
*p = 10;
return 0;
}
const修饰 * 右边后我们可以修改指针指向的内容
但是不能修改指针指向的地址
当 const 修饰俩边后 p 所指向的地址还是内容都是不能更改的
int n = 0;
int m = 0;
const int* const p = &n;
*p = 10;
p = &m;
5.1 野指针
野指针就是指针指向的位置是不可知的。
造成野指针的原因
- 指针未初始化。
- 指针越界访问。
- 指针指向已释放空间。
规避野指针
- 指针初始化
使用指针前要知道指针指向的空间,给予指针初始化,如果不知道有赋予指针空指针(NULL)。 - 防止指针越界
一个程序申请了多少空间,指针也只能访问多少空间,超过就是越界了 - 避免返回局部变量的地址