▶️文章目录
✅1.指针的概念
✅2.指针和指针类型
✅3.野指针
1.指针的概念
include <stdio.h>
int main()
{
int a=10;//在内存中开辟一块空间
int*p=&a;//这里我们对变量a,取出它的地址,可以使用&操作符。
//a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量中,p就是一个指针变量。
return 0;
}
指针变量的大小:
对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1或者0);那么32根地址线产生的地址就会是:
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
...
11111111 11111111 11111111 11111111
这里就有2的32次方个地址。
每个地址标识一个字节,那我们就可以给(2^32Byte == 2^32/1024KB == 2^32/1024/1024MB==2^32/1024/1024/1024GB == 4GB)4G的空闲进行编址
2.指针和指针类型
int*指针解引用的访问情况:
char*指针解引用的访问情况:
define _CRT_SECURE_NO_WARNINGS
include<stdio.h>
int main()
{
int a = 0x11223344;
int* pa = &a;
char* pc = (char*)&a;
printf("%d\n", pa);
printf("%d\n", pa+1);
printf("%d\n", pc);
printf("%d\n", pc+1);
return 0;
}
3.野指针
3.1野指针成因
- 指针未初始化
include <stdio.h>
int main()
{
int*p;//局部变量指针未初始化,默认为随机值
*p=20;
return 0;
}
- 指针越界访问
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野指针成因
- 指针未初始化
include <stdio.h>
int main()
{
int*p;//局部变量指针未初始化,默认为随机值
*p=20;
return 0;
}
- 指针越界访问
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;
}