四川省住房和城乡建设局网站首页,怎么给网站做网页,房屋装修免费设计出图,小红书网站建设目的简单不先于复杂#xff0c;而是在复杂之后。 目录
1. 指针是什么#xff1f;
2. 指针和指针类型
2.1 指针-整数
2.2 指针的解引用
3. 野指针
3.1 野指针成因
3.2 如何规避野指针 1. 指针是什么#xff1f; 指针理解的两个要点#xff1a; 1. 指针是内存中最小…简单不先于复杂而是在复杂之后。 目录
1. 指针是什么
2. 指针和指针类型
2.1 指针-整数
2.2 指针的解引用
3. 野指针
3.1 野指针成因
3.2 如何规避野指针 1. 指针是什么 指针理解的两个要点 1. 指针是内存中最小单元的编号也就是地址。 2. 平时口语中说的指针通常指的是指针变量是用来存放内存地址的变量。 总结指针就是地址口语中说的指针通常是指针变量。 int main()
{
int a 10;//a是整型变量占用4个字节的内存空间
int* pa a;//pa是一个指针变量用来存放地址的
//取地址时取的是第一个字节的地址return 0;
} 总结 指针变量用来存放地址的变量。存放在指针中的值都被当成地址处理。 一个小的内存单元多大 ---1byte 如何编址经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。 对于32位的机器假设有32根地址线那么假设每根地址线在寻址的时候产生高电平高电压和低电平低电压就是1或者0 那么32根地址线产生的地址就会是 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 ... 11111111 11111111 11111111 11111111 总结 1. 指针是用来存放地址的地址是唯一标识一块地址空间的。 2. 指针的大小在32位平台是4个字节在64位平台是8个字节。 C语言的%zu是用来格式化输出size_t类型数据的格式控制符。 size_t是C标准库中定义的一个无符号整型类型用于表示内存空间大小和数组索引等非负整数值。在C语言中sizeof操作符用于计算指定类型或表达式的大小即占用的字节数并返回一个size_t类型的值。 需要注意的是%zu只能用于格式化输出size_t类型的值不能用于其他类型的数据。 如果把一个非size_t类型的数据使用%zu格式控制符进行输出可能会导致输出结果不正确甚至导致程序崩溃。 2. 指针和指针类型 变量有不同的类型整型、浮点型等。 指针也有类型。 当有这样的代码 结论指针类型决定了指针在被解引用的时候访问几个字节 1. 如果是int*的指针解引用访问4个字节 2. 如果是char*的指针解引用访问1个字节 在这段代码中整型指针变量pa和字符型指针变量pc所指向的地址是相同的即它们都指向变量a的内存地址。 这是因为在C语言中变量在内存中的存储方式是连续的而不同类型的指针变量只是指向这些内存地址的方式不同。 在这段代码中变量a在内存中的存储方式是以4个字节为一个单位进行存储因此它的地址是一个整型地址。 当将变量a的地址赋给整型指针变量pa时pa所指向的地址与a的地址是相同的因为它们都是整型地址。 当将变量a的地址强制转换为字符型指针类型并赋给字符型指针变量pc时pc所指向的地址也与a的地址相同这是因为强制类型转换只改变了指针变量的解释方式而并没有改变指针变量所指向的地址。 因此虽然整型指针变量和字符型指针变量的类型不同但它们所指向的地址是相同的。 2.1 指针-整数 总结指针的类型决定了指针向前或向后走一步1-1操作有多大也就是指针的步长。 2.2 指针的解引用 总结 指针的类型决定了对指针解引用的时候有多大的权限能操作几个字节。 比如char* 的指针解引用就只能访问一个字节而int* 的指针解引用就能访问四个字节。 3. 野指针 概念野指针就是指针指向的位置是不可知的随机的不正确的没有明确限制的。 3.1 野指针成因 1. 指针未初始化 int main()
{
int* p;//没有初始化就意味着没有明确的指向
//一个局部变量不初始化的话放的是随机值0xcccccccc*p 10;//非法访问内存这里的p就是野指针return 0;
} 2. 指针越界访问 int main()
{
int arr[10] { 0 };
int* p arr;//arr[0]
int i 0;
for (i 0; i 10; i)
{
*p i;
p;
}
//当指针指向的范围超出数组arr的范围时p就是野指针
return 0;
} 3. 指针指向的空间释放动态内存开辟时讲解 int* test()
{
int a 10;
return *a;
}
int main()
{
int*p test();return 0;
} 3.2 如何规避野指针 指针初始化小心指针越界指针指向空间释放时及时置NULL 避免返回局部变量的地址指针使用之前检查有效性零地址禁止访问指针没有指向有效空间。 这段代码有一个明显的问题就是在函数test()中声明的变量a是一个局部变量在函数执行完毕后将被销毁。 因此返回该变量的地址是不安全的因为该地址将指向一块已经被销毁的内存。 这将导致指针变量p所指向的地址变成了一个野指针可能会引发不可预测的错误这是一种非常危险的行为。 如果想要正确地使用返回指针可以考虑使用动态内存分配函数malloc()来分配一块内存并将变量的值存储在该内存块中然后返回该内存块的地址。 动态内存分配在之后的博客会有所体现。 这样可以确保返回的地址始终有效并且可以安全地使用指针变量。 int main()
{
int a 0;
int* p a;
*p 20;
//null - 0int* p2 NULL;
*p2 100;//errint* p3 NULL;if (p3 ! NULL)
{
*p3 100;//ok
}return 0;
}