目录
1.指针是什么?
1.指针是内存中的一个最小单元的编号,也就是地址。
2.指针通常是指针变量,用来存放地址。
内存被划分为一个个小的内存单元,一个基本的内存单元的大小是1个字节。内存单元的编号又称为地址。
我们的计算机有32位平台也有64位平台。
32位-32根地址线-物理的电线-通电-1/0
0000000000000000000000000000000
0000000000000000000000000000001
0000000000000000000000000000010
...
111111111111111111111111111111111111
一共有2^32,每个地址管理一个字节,一共管理的大小是2^32byte/1024/1024/1024 = 4GB
同理可得,64位平台是8GB。
我们知道了32位平台有32个0/1组成的,也就是32个bit位也就是4Byte。所以算出的指针的大小是4/8的。(32位平台是4Byte,64位平台是8Byte)
2.指针和指针类型
看这个代码,int*类型的在*p后可以直接更改4Byte,然而,再来看看这个
char类型的指针只能访问一个字节。指针类型决定了在解引用时一次能访问几个字节(指针的权限)。
这里可以看到,一个整形指针+1向后走4个字节,一个字符指针+1向后走1个字节。
指针类型决定了指针向后走一步走多大距离(单位是字节)。
3.野指针
野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)
3.1野指针的成因
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<=10; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*p = i;
p++;
}
return 0;
}
3. 指针指向的空间释放
#include<stdio.h>
int* test()
{
int a = 100;
return &a;
}
int main()
{
int* p = test();
printf("%d", *p);
return 0;
}
3.2 如何规避野指针
1. 指针初始化
2. 小心指针越界
3. 指针指向空间释放即使置NULL(放置NULL后,不能在进行赋值)
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性
4.指针-指针
指针-指针的意思是两个地址之间元素的个数。
但是指针-指针的前提是:两个指针指向同一块空间。
5.二级指针
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里? 这就是 二级指针 。
6.指针数组
指针数组是指针还是数组? 答案:是数组。是存放指针的数组。
例如int* arr[5] = { &a,&b,&c };
可以通过arr找到a,b,c的值。