目录
一、更新时间
2022.2.12
二、初识指针
1.内存的概念
内存是一种存储器,所有程序都在内存中运行。将内存分为一个个小的内存单元,每个内存单元大小为一个字节,对内存单元进行编号,这些编号就是内存的地址。
问题1(内存如何编号):以32位机器为例,32为32根地址线,对线通电将电信号转为数字信号,数字信号的组合数量为2的32次方,这些就是内存的编号,也就是这个内存单元的地址。
问题2(一个内存单元多大):一个内存单元为一个字节大B。

如上图对于a来说,int型为4个字节,对于其地址如图所示。使用指针取地址a时会拿取起始的第一个字节的地址。打印出来a的地址如下图所示。

2.指针变量
如下图所示定义一个指针变量,用于存储地址的变量为指针变量,对于iint* pa来说,pa为指针变量,而int说明pa执行的对象为int类型。

通过地址找到其内部存储的单元,也就是说可以通过操作地址的方式来间接改变a的值。使用解引用操作符*可以通过pa里面的地址寻找到a,并对a的值进行修改。如下图所示。

在32位编译器中指针变量大小都为4位,在64位编译器中指针变量大小都为8位。指针是用于存放地址的,指针多大取决于地址多大。也就是说32位也就是4个字节大B,64位就是8个字节大B。
3.指针与指针类型
不是说指针变量都为4个字节指针类型就没有意义,不同类型的指针类型决定了指针解引用的权限。比如int型的指针能访问4个字节,而char型只能访问一个字节,也就是说包括在打印时也能看到,整形指针加1地址会加4,而字符型指针加1地址只会加1。
指针类型决定了指针走一步走多远,或者说是能走几个地址。
下面的例子很好的说明了这种情况,将本是0的数组变成了全为1。在加一与解引用的时候都为整形的4个字节。

4.野指针
野指针就是指针指向的位置是不可知的。
4.1 野指针产生的原因:
1.指针没有初始化造成非法访问内存
int main()
{
int* p ;//局部变量没有初始化,默认为随机值
*p = 20;
return 0;
}
2.指针越界,指向不该指向的范围
int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0;
for (i = 0;i <= 10;i++)//循环了11次,最后一次指向了不应该指向的地方
{
*p = i;
p++;
}
return 0;
}
3.指针指向的空间被释放(指向的地址用完后被还给操作系统但是指针还记录着地址)
比如说有一个女朋友,没有分手的时候可以去她家和她住;有一天分手了,即使你仍然记得她家的位置,也不能再去她家找她住了,因为她不是属于你的女朋友了,如果强行根据你记住的地址去访问她家这就是一种非法行为。
#include <stdio.h>
int* test()
{
int a = 10;
return &a;
}
int main()
{
int* p = test();//此时函数test已经执行完,局部变量a已经被释放,只是返回了地址
*p = 20;//地址已经不属于a了,此时已经属于非法访问内存
return 0;
}
4.2 野指针如何规避:
1.指针初始化(不知道当前该初始化为啥时候,直接初始化为NULL);
2.小心指针越界(C语言本身不能检查数组的越界行为);
3.指针使用前检查其有效性( if( p ! = NULL ) );
4.指针的指向空间被释放时及时放置NULL。
5.指针运算
5.1 指针±整数 指针关系运算
#include <stdio.h>
#define N 5
float value[N];
float* vp;
int main()
{
for (vp = &value[0];vp < &value[N];)//指针的关系运算
{
*vp++=0;//指向下一个数组地址元素将其赋值为0
}
}
5.2 指针减指针
指针减去指针等于两者之间元素个数。注意指针与指针相减的前提是两个指针指向同一块空间。

5.指针和数组关系
数组名为数组首元素的首地址。

6.二级指针
对于指针变量来说,也有自己存放的地址。如果多级指针想要找到一级指针的地址的变量值,有几级就解引用几次。

7.指针数组
#include <stdio.h>
int main()
{
int arr[10];//存放整形的数组
char ch[10];//存放字符的数组
int* parr[5];//存放整形指针的数组
return 0;
}
本文深入介绍了C语言中的指针,包括内存的地址概念、指针变量、指针类型、野指针及其避免方法、指针运算以及指针与数组的关系。特别强调了野指针的危害和预防措施,如初始化、避免越界和检查有效性。同时,讨论了指针在内存中的运算规则,如指针加减整数和指针关系运算。

169

被折叠的 条评论
为什么被折叠?



