C语言基础之——指针(上)

前言:小伙伴们又见面啦!本期内容,博主将展开讲解有关C语言中指针的上半部分基础知识,一起学习起来叭!!!


目录

一.什么是指针

二.指针类型

1.指针的解引用

2.指针+-整数

三.野指针

1.野指针成因

(1)指针未初始化

(2)指针越界访问

2.如何规避野指针

四.总结


一.什么是指针

  1. 指针是内存中一个最小单元的编号,也就是地址
  2. 我们平时所说到的指针,一般都是指针变量,是用来存放内存地址的变量

所以说指针实际上是一个地址 ,而存放在指针中的值都会被当成地址处理。

这里有一个小知识点:指针在32位平台上占4个字节,在64位平台上则占8个字节。具体内容相对复杂,我们这里不做讲述。

还有一点要注意,一个指针虽然占有四个字节,但是它存储的地址仅仅为一个字节,也就是这四个字节的头头。

二.指针类型

我们知道,定义一个指针变量就跟定义一个普通的变量一样,可以有不同的类型。

那我们又知道不同类型的变量,又会占有不同的内存大小。

那么不同类型的指针,也会占有不同的内存大小吗???

cs 复制代码
#include<stdio.h>
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类型变量的地址

那既然并不会影响指针的内存大小,定义这么多类型的指针又有什么意义呢???

1.指针的解引用

什么是指针的解引用呢???

当我们用指针变量通过地址来访问或者修改一个变量的值,就叫解引用。

cs 复制代码
#include<stdio.h>
int main()
{
	int n = 0x11223344;
	int* p = &n;
	*p = 0;
	return 0;
}

假如我们初始化变量n的内存大小为0x11223344 ,然后我们用int型的指针变量来解引用将其值改为0,我们来看它的内存怎么变化:

可以看出n的四个字节的内存大小都变为了0

cs 复制代码
#include<stdio.h>
int main()
{
	int n = 0x11223344;
	char* p = &n;
	*p = 0;
	return 0;
}

同样的方式,这次我们换成char型的指针变量,又会是什么结果呢???

可以很轻易的看出,char型的指针变量,仅仅让n的一个字节的内存大小变为了0

这便是指针类型的意义:

指针类型决定了指针进行解引用操作的时候,访问几个字节。

2.指针+-整数

cs 复制代码
#include<stdio.h>
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个字节

这也是指针类型的意义:

指针类型决定了指针进行+-操作的时候,跳过几个字节。

三.野指针

所谓野指针,也就是说指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)

1.野指针成因

(1)指针未初始化

int *p;

*p = 10;

这样的解引用方式直接就是错误的,在VS环境下直接就会报错:

(2)指针越界访问

cs 复制代码
#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	for (i = 0; i <= 10; i++)
	{
		*p = 1;
		p++;
	}
	return 0;
}

假如我们想用一个指针来改变数组中的每一个值,但是却不小心超过了数组的大小,这样就造成了越界访问,出现了错误。

指针指向的地址超过了数组的范围,就变成了野指针

2.如何规避野指针

  1. 指针要初始化
  2. 小心指针越界
  3. 指针指向的空间释放,及时置NULL
  4. 避免返回局部变量的地址
  5. 指针使用之前检查有效性

这里要注意一点,如果我们非要定义一个未知指向的指针,就要将其置NULL,也就是置0

当指针置NULL时,也相当于是存了一个空地址,不能对这个地址直接进行操作。

想要操作此指针,就必须让它指向其他已知的地址

四.总结

以上就是有关C语言基础------指针的上半部分的内容啦,稍后博主将更新指针(下),一起期待一下叭!

喜欢博主文章的小伙伴们不要忘记一键三连哦!

我们下期再见!

相关推荐
q5673152316 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
许野平41 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
也无晴也无风雨44 分钟前
在JS中, 0 == [0] 吗
开发语言·javascript
狂奔solar1 小时前
yelp数据集上识别潜在的热门商家
开发语言·python
朱一头zcy1 小时前
C语言复习第9章 字符串/字符/内存函数
c语言
此生只爱蛋1 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
blammmp1 小时前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧2 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
暗黑起源喵2 小时前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong2 小时前
Java反射
java·开发语言·反射