前言:小伙伴们又见面啦!本期内容,博主将展开讲解有关C语言中指针的上半部分基础知识,一起学习起来叭!!!
目录
一.什么是指针
二.指针类型
1.指针的解引用
2.指针+-整数
三.野指针
1.野指针成因
(1)指针未初始化
(2)指针越界访问
2.如何规避野指针
四.总结
所以说指针实际上是一个地址,而存放在指针中的值都会被当成地址处理。
这里有一个小知识点:指针在32位平台上占4个字节,在64位平台上则占8个字节。具体内容相对复杂,我们这里不做讲述。
还有一点要注意,一个指针虽然占有四个字节,但是它存储的地址仅仅为一个字节,也就是这四个字节的头头。
我们知道,定义一个指针变量就跟定义一个普通的变量一样,可以有不同的类型。
那我们又知道不同类型的变量,又会占有不同的内存大小。
那么不同类型的指针,也会占有不同的内存大小吗???
#include
int main()
{
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(double*));
return 0;
}
我们知道sizeof是一个计算内存大小的关键字,我们用它来测试一下,结果如下:
令人出乎意料,不同类型的指针变量,占用的内存大小竟然都相同,为什么呢???
事实上,我们定义不同类型的指针,只是为了用这个指针来存放这种类型的变量的地址。
例如我们定义char*类型的指针,只是为了存放char类型变量的地址。
那既然并不会影响指针的内存大小,定义这么多类型的指针又有什么意义呢???
什么是指针的解引用呢???
当我们用指针变量通过地址来访问或者修改一个变量的值,就叫解引用。
#include
int main()
{
int n = 0x11223344;
int* p = &n;
*p = 0;
return 0;
}
假如我们初始化变量n的内存大小为0x11223344,然后我们用int型的指针变量来解引用将其值改为0,我们来看它的内存怎么变化:
可以看出n的四个字节的内存大小都变为了0。
#include
int main()
{
int n = 0x11223344;
char* p = &n;
*p = 0;
return 0;
}
同样的方式,这次我们换成char型的指针变量,又会是什么结果呢???
可以很轻易的看出,char型的指针变量,仅仅让n的一个字节的内存大小变为了0。
这便是指针类型的意义:
指针类型决定了指针进行解引用操作的时候,访问几个字节。
#include
int main()
{
int n = 5;
int* p1 = &n;
char* p2 = &n;
printf("p1 = %p\n", p1);
printf("p1 + 1 = %p\n", p1 + 1);
printf("p2 = %p\n", p2);
printf("p2 + 1 = %p\n", p1 + 1);
return 0;
}
看这段代码,int型的指针变量p1和char型的指针变量p2的内存地址是什么结果?
p1和p2两个指针分别 + 1之后又会是什么结果呢?
能够看出,两个指针变量是可以同时访问一个变量的地址的。
p1+1的后的内存跳过了4个字节,而p2+1后的内存地址仅仅之跳过了1个字节。
这也是指针类型的意义:
指针类型决定了指针进行+-操作的时候,跳过几个字节。
所谓野指针,也就是说指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)。
int *p;
*p = 10;
这样的解引用方式直接就是错误的,在VS环境下直接就会报错:
#include
int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0;
for (i = 0; i <= 10; i++)
{
*p = 1;
p++;
}
return 0;
}
假如我们想用一个指针来改变数组中的每一个值,但是却不小心超过了数组的大小,这样就造成了越界访问,出现了错误。
指针指向的地址超过了数组的范围,就变成了野指针。
这里要注意一点,如果我们非要定义一个未知指向的指针,就要将其置NULL,也就是置0。
当指针置NULL时,也相当于是存了一个空地址,不能对这个地址直接进行操作。
想要操作此指针,就必须让它指向其他已知的地址。
以上就是有关C语言基础——指针的上半部分的内容啦,稍后博主将更新指针(下),一起期待一下叭!
喜欢博主文章的小伙伴们不要忘记一键三连哦!
我们下期再见!