Ⅰ、指针是什么
1.把内存划分为一个个内存单元,每个内存单元的大小是一个字节 1 byte = 8 bit
→1KB = 1024字节 →1 MB = 1024 GB →TB PB...
2.每个字节都给一个唯一的编号,这个内存单元的编号==地址==指针
(口语中说的指针通常指的是指针变量。)
注:取地址取的是小的地址
Ⅱ、指针变量及其大小是什么
指针变量是存放指针的,指针就是地址
一个地址的存储需要多大空间,指针变量的大小就是几个字节
插入:内存是如何编址的
对于
32
位的机器,假设有
32
根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电 平(低电压)就是(1
或者
0
);
那么
32
根地址线产生的地址就会是:
- 32位机器上 32根地址线 2^32个地址 →字节 →4GB空间进行编址
- 64位机器同理
提问: 64位机器上,指针变量的大小为什么是8个字节?
64位平台下地址是64个bit位(即8个字节)
总结:指针大小在32位平台是4个字节,64位平台是8个字节
int main()
{
int a = 10; // 变量的创建是需要向内存申请空间的 向内存申请4个字节的空间
printf("%p\n",&a); // %p专门用来打印地址的
int* pa = &a; // pa叫指针变量 存放指针 整型指针类型 &-取地址操作符
*pa = 20; // *-解引用操作符-通过pa找到pa指向的a *pa 就是 a
printf("%d\n",a);
return 0;
}
Ⅲ、指针类型及其意义
1.指针的解引用
对指针解引用的时候有多大的权限(能操作几个字节)
整型指针,解引用,访问4个字节
- 字符型指针,解引用,访问1个字节
2.指针+/-整数
指针的类型决定了指针向前或者向后走一步有多大(距离)。(指针进行+1 -1的时候)
pa+n 等价于 +n*sizeof(int)
pc+n 等价于 +n*sizeof(char)
应用:
Ⅳ、野指针
1.概念:
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
2.野指针成因
1)指针未初始化
#include <stdio.h>
int main()
{
int* p;//局部变量指针未初始化,默认为随机值
*p = 20;
return 0;
}
2)指针越界访问
#include <stdio.h>
int main()
{
int arr[10] = {0};
int *p = arr;
int i = 0;
for(i=0; i<=11; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0;
}
3)指针指向的空间释放
3.如何规避野指针
1).
指针初始化
2).
小心指针越界
3).
指针指向空间释放,及时置
NULL
4).
避免返回局部变量的地址
5).
指针使用之前检查有效性