深入探究C语言中的常量指针与野指针概念及其应用

【C语言基础】野指针与空指针 全网最接地气的C语言野指针介绍,此处对于野指针与空指针知识点做一些简要的介绍,作者实属初学,写博客也是作者学习的一个过程,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,希望大家多多给予支持,赠人玫瑰,手有余香! 文章目录一:野指针1.1 :野指针的成因2.1 :规避野指针二:空指针 一:野指针 概念:野指针就是指向的内存地址是未知的(随机的,不正确的,没有明确限制的)。 说明:指针变量也是变量,是变量就可以任意赋值。但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向 阅读详情

目录

常量指针(Constant Pointers)

1. 指向常量的指针

2. 常量指针

以下是一个使用const声明常量的示例:

通过修改被const修饰的a的地址,修改a的值

const位置的不同

 指针的应用

利用指针打印数组的几种方式

野指针(Wild Pointers)的产生

野指针(Wild Pointers)的危害

如何避免

学习指针的目的是使用指针解决问题,那什么问题,非指针不可呢?

模拟实现库函数strlen

应用场景


常量指针(Constant Pointers)

在C语言中,const关键字用于声明常量,而野指针则是一种危险的指针类型。下面将详细解释这两个概念及其应用。

常量指针是指指向常量的指针,它不能用来修改所指向的数据。这有助于保护数据不被意外修改,提高程序的安全性和可维护性。

1. 指向常量的指针

当你想阻止通过指针修改数据时,可以使用指向常量的指针。这种指针的类型是指向常量的指针类型,例如 int * const p;。这意味着你不能通过这个指针来修改它所指向的数据。

2. 常量指针

另一种形式是常量指针,即指针本身的值不能被修改,但可以通过该指针修改其指向的数据。这种指针的类型是指向非常量的常量指针类型,例如 const int *p;。这意味着你不能修改指针 p 所指向的数据的值。

以下是一个使用const声明常量的示例:

#include <stdio.h>

int main() 
{
	const int a = 10;//a具有了常属性(不能被修改了)
	//a本质上还是变量
	//在C++中,const修饰的变量就是常量
	//a = 20; 错误,a修改不了
	//int arr[a]; 错误  a不算常量值
    printf("%d\n", a);
    return 0;
}

在这个示例中,我们声明了一个名为a的整型常量,并将其初始化为10。然后我们使用printf函数输出a的值。注意,我们不能修改a的值,否则编译器会报错。

 

通过修改被const修饰的a的地址,修改a的值

int main()
{
	const int a = 10;
	//a = 20;//error
	int* p = &a;
	*p = 0;
	printf("a = %d\n", a);
	return 0;
//}

 

 const位置的不同

//const 修饰指针变量的时候,放在*的右边
//const 限制的是指针变量本身,指针变量不能再指向其他变量了
//但是可以通过指针变量,修改指针变量指向的内容

int main()
{
	int a = 10;
	int b = 20;
	int* const p = &a;
	//一但指向a就不能指向b了
	//p = &b;//error
	*p = 100;//修改*p却可以
	printf("a = %d\n", a);
	return 0;
}

//const 修饰指针变量的时候,放在*的左边
//限制的是指针指向的内容,不能修改指针指向的内容
//但是可以修改指针变量本身的值(修改指针变量的指向)

int main()
{
	int a = 10;
	int b = 20;
	int const* p = &a;
	//一但指向a就不能指向b了
	p = &b;//OK
	//*p = 100;//error
	printf("a = %d\n", a);
	return 0;
}

//int const* const p = &a
//*两边都加上const 就都改不了了

int main()
{
	int a = 10;
	int b = 20;
	int const* const p = &a;
	//一但指向a就不能指向b了
	//p = &b;//error
	//*p = 100;//error
	printf("a = %d\n", a);
	return 0;
}

 指针的应用

 利用指针打印数组的几种方式

//用指针打印数组

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = &arr[0];
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *p);
		p++;
	}
	return 0;
}

//另一种方法

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = &arr[0];
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(p+i));
		
	}
	return 0;
}

//利用指针的关系运算打印数组

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;//等于 &arr[0];
	int sz = sizeof(arr) / sizeof(arr[0]);
	while (p < arr + sz)
	{
		printf("%d ", *p);
		p++;
	}

	return 0;
}


//指针-指针的前提是,两个指针指向同一个空间

int main()
{
	int arr[10] = { 0 };
	printf("%zd ", &arr[9] - &arr[0]);//9
	return 0;
}

 野指针(Wild Pointers)的产生

野指针通常产生于**未初始化的指针、指针越界访问以及指向已释放内存的指针**。具体如下:

1. 未初始化的指针:定义指针变量时,如果没有进行初始化,那么该指针的值是随机的,可能指向任意的内存地址。这种情况下,如果尝试通过这个指针去读取或写入数据,可能会导致程序崩溃或其他不可预期的行为。

2. 指针越界访问:当指针超出了它所指向的数据结构(如数组)的边界时,就会发生越界访问。例如,一个指向大小为10的数组的指针,如果尝试访问数组的第12个元素,就会造成越界。

3. 指向已释放内存的指针:当一块内存被释放后,原有的指针如果继续指向这块内存,而没有置空或者重新赋值,这个指针就变成了所谓的“悬挂指针”或“野指针”。

为了避免野指针的产生和影响,应当总是在声明指针时对其进行初始化,并在释放指针指向的内存后立即将指针置为NULL,同时确保指针在其有效作用域内使用。

代码如下:

//未初始化指针,产生的野指针

int main()
{
	int* p;//p是一个局部变量,不初始化的默认存的是随机值
	*p = 20;
	//报错 printf("%d \n", p);
	return 0;
}

//数组越界,产生的野指针

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = &arr[0];
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i <= sz; i++)
	{
		printf("%d ", *p);
		p++;
	}
	return 0;
}

//指针指向的空间释放,产生的野指针

int test()
{
	int a = 10;
	return &a;
}
int main()
{
	int* p = test();
	printf("%d \n", *p);
	return 0;
}

野指针(Wild Pointers)的危害

野指针的危害主要体现在以下几个方面:

1. 触发段错误:当野指针指向一个不可访问的内存地址时,尝试对其进行解引用操作可能会导致段错误,这是因为程序试图访问一个非法的内存区域。

2. 数据损坏:如果野指针指向了一个正在被其他部分的程序使用的内存空间,并且通过这个野指针修改了该内存空间的内容,那么可能会导致数据损坏,甚至程序崩溃。

3. 内存泄漏:在某些情况下,野指针可能导致内存泄漏。例如,如果一个野指针指向了一块已经分配但未被释放的内存,而这块内存又在其他地方被重复分配,就会造成内存泄漏。

4. 调试困难:野指针的存在可能会使得程序的调试变得非常困难,因为它们可能在程序的任何地方引发错误,而且这些错误可能不会立即显现,增加了查找和修复问题的难度。

 如何避免

为了避免野指针带来的危害,可以采取以下措施:

1. 初始化指针:在声明指针变量时,应当对其进行初始化,避免其成为一个野指针。

2. 及时置空:当一个指针不再使用时,或者它所指向的内存空间已经被释放时,应该将其置为NULL,以防止其成为野指针。

3. 谨慎解引用:在使用指针前,应当确保它指向的是一个有效的内存地址,避免对无效地址进行解引用操作。

4. 使用智能指针:在一些支持智能指针的编程语言中,可以使用智能指针来自动管理内存,减少野指针的产生。

        总的来说,野指针是C/C++编程中的一个常见问题,它们可能导致程序不稳定、数据损坏和内存泄漏等严重问题。因此,理解野指针的危害并采取适当的预防措施是非常重要的。

 学习指针的目的是使用指针解决问题,那什么问题,非指针不可呢?

 两个数的交换

void swap(int* pa, int* pb)
{
	int tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	printf("交换前:%d %d\n", a, b);
	swap(&a, &b);
	printf("交换前:%d %d\n", a, b);
	return 0;
}

 模拟实现库函数strlen

模拟实现库函数strlen

int my_stelen(char* str)
{
	int count = 0;
	while (*str!='\0')
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[] = "abcdef";
	int len = my_stelen(arr);
	printf("%d ", len);
	return 0;

}

应用场景

  • 常量指针:当你想保护某些数据不被修改时,可以使用常量指针。例如,在函数参数中传递一个指向常量的指针,这样在函数内部就不能修改这个数据。
  • 野指针:避免使用未初始化的指针和已经释放的内存地址的指针,以减少程序出错的风险。确保在使用指针之前进行适当的初始化,并在不再需要时将其置为NULL。

希望对你有帮助~加油各位!!

C语言中的指针与数组:概念、关系与应用 指针和数组是C语言中最基本的概念之一,它们相互关联且具有强大的功能。通过指针,可以实现动态内存管理、操作数组、处理字符串等复杂任务。数组的名字本质上是一个指针,因此,指针和数组之间有很多巧妙的用法和相互转换。要深入掌握C语言,理解指针和数组的关系是非常重要的。指针使得C语言能够直接操作内存,而数组则提供了一种方便的方式来存储和操作多个数据元素。 阅读详情

相关推荐

C语言 指针——常量指针、指针常量、指向常量的指针常量

文章目录常量指针 与 指针常量常量指针指针常量指向常量的常指针指针数组 与 行指针指针数组行指针二重指针 与 行指针二重指针行指针函数指针 与 指针函数函数指针指针函数 常量指针 与 指针常量 常量指针 常量指针:指针指向的内容是常量 常量指针说的是不能通过这个指针改变变量的值 但是可以通过其他的引用来改变变量的值。 int const *p; int a = 4; p = &a; *p ...

qq_40939814的博客 850

【C语言】指针(野指针)

野指针:就是指针指向的位置是不可知(随机性,初始化,不正确,没有明确限制),指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。 指针越界也会导致野指针问题,这里解释下:就是当你指针指向的范围超过数组名范围时,那么那个指针就是野指针了。...

"謓泽"正在路上朝着"攻城狮"方向"前进四"! 4262

光猫桥接后网速不升反降?可能是你的路由器在“偷懒”!

本文详细分析了光猫桥接后网速不升反降的常见原因,包括路由器性能不足、MTU/MSS值设置错误等,并提供了四个关键排查步骤和路由器选购指南。通过优化PPPoE拨号设置和硬件配置,帮助用户解决网速下降问题,提升家庭网络性能。

hqmln的博客 612

C语言——常量指针、指针常量以及指向常量的指针常量三者区别详解

常量指针和指针常量的区别 常量指针、指针常量以及指向常量的指针常量概念简要描述

kingscoming的博客 1万+

分离与合体题解(区间DP)

题目: 经过在机房里数日的切磁,LYD从社神牛那里学会了分离与合体,出关前,杜神牛给了他一个测试 杜神牛造了个区域,它们紧邻着排成了一行,编号1-n。在这經个区域里都放着一把OI界 的金钥匙,每一把都有一定的价值,LYD当然想得到它们了。然而杜神牛规定LYD不可以一下子 把它们全部拿走,而是每次只可以拿一把。为了尽快地拿到所有的金钥匙,LYD自然就用上了刚学的分离与合体特技。 开始LYD可以选择从1~n-11~n-11~n-1的任何一个区域(记为K)进入,进入后LYD会在K区域发 生分离,从而分离为两个小L

cqbz_lipengcheng的博客 371

基于STM32和MPU6050的手势控制小车设计与实现

MPU6050传感器:用于检测手势变化,采集加速度和陀螺仪数据。STM32微控制器:处理MPU6050传感器的数据,根据手势变化控制小车的运动。电机驱动模块:接收来自STM32的控制信号,驱动小车的电机,实现小车的前进、后退、左转和右转。小车底盘:作为整个系统的机械部分,提供移动平台。MPU6050是一款集成了3轴加速度计和3轴陀螺仪的传感器,具有高精度、低功耗和小体积等特点。它通过I2C接口与微控制器通信,可以实时采集加速度和角速度数据,广泛应用于运动检测、姿态控制和手势识别等领域。

m0_57781768的博客 2309

【C语言】带你层层深入指针——指针详解3(野指针、assert等)

本文深入探讨了C语言指针中的野指针问题、assert断言和const修饰指针的应用。首先分析了野指针的成因(未初始化、越界访问、指向已释放空间)及防范措施(初始化、检查有效性、避免返回局部变量地址)。其次介绍了assert断言的使用方法及其调试优势,包括自动定位错误和开关控制功能。最后详细讲解了const修饰指针的两种形式:const在左边限制指针指向内容的修改,在右边限制指针变量本身的修改。通过代码示例直观展示了各类指针操作的正确与错误用法,帮助开发者编写更安全可靠的指针代码。

zore__的博客 6291

RAGFlow系列(06):从0.20.0版本升级到最新版的完整指南

本文提供了从RAGFlow 0.20.0版本升级到最新版的完整指南。升级前务必进行数据、配置和状态的三层备份,尤其是智能体配置因版本间存在不兼容风险。指南详细说明了如何优雅停止服务、拉取新代码、检查并调整配置文件(如端口、环境变量),以及最终部署验证的步骤,确保升级过程平滑安全。

weixin_29243279的博客 464

C语言——野指针的概念和规避方法

野指针的概念和规避方法

YT54936543的博客 1577

CKS-CN考试之路----04

根据上面信息我们知道,这个pod运行在default命名空间下,pod名字为cpu-77cd5ddcbf-bvb8w。可以从/etc/falco/falco_rules.yaml中获得相关内容,大概在文件的460行左右.编辑/etc/falco/falco_rules.local.yaml。7c688a8bfd69即是我们想要获得的docker id。将行为不当 Pod 的 Deployment 缩放为零副本。根据我们刚才定义的rule生成报告。访问/dev/mem 的 Pod。那么如果考试记不住怎么办?

Q先生 602

Educoder:爬虫实战——求是网周刊文章爬取

第1关:获取新闻url importrequests importre defgeturls(): #**********Begin**********# url='http://www.qstheory.cn/dukan/qs/2014/2019-01/01/c_1123924172.htm' headers={ 'User-Agent':'Mozilla/5.0(Linux;Android6.0;Nexus5Buil...

weixin_46026136的博客 5254

C语言:函数指针、二级指针、常量指针常量、野指针

二级指针(多重指针)用于储存一级指针的地址,需要两次解引用才能访问原始数据。其他多重指针的用法类似,但实际开发中最常见的指针是二级指针。int a = 10;// a是普通变量,也就是原始数据// 一级指针,p指向a,解引用1次就可以获取a的值// 10// 二级指针,w指向p,解引用2次就可以获取a的值// 10// 三级指针,k指向w,解引用3次就可以获取a的值类型本质内存布局等效性二级指针(int**指向指针的指针指针的指针与指针数组等效指针数组(int*[]

2301_77829391的博客 1192

YOLO11 锚框机制全解析:从改进 K-means 聚类到自适应优化,附多场景实战(附代码)

摘要 YOLO11的锚框机制采用"自适应、动态化、场景感知"的设计理念,通过数据驱动的锚框生成、多尺度感知分配和实时优化策略,显著提升目标检测性能。相较于早期YOLO版本,YOLO11的锚框完全基于训练集目标分布自适应生成,并引入智能分配策略,使不同尺寸目标获得最优匹配。技术架构包含自适应锚框生成、多尺度分配器和动态优化模块,通过改进的K-means聚类和交并比计算实现精准匹配。YOLO11锚框机制在检测精度、训练稳定性和场景适应性方面均有显著提升,为复杂场景下的目标检测提供更优解决方案

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1321

C语言基础—常量指针与指针常量、二级指针、动态内存分部

①二级制指针与指针数组等效,可简化指针数组的遍历操作。int(*)[3]),与二级指针int**类型不兼容。③操作非字符型二级指针时,须通过两次解引用访问实际数据。main函数有多种定义格式,main函数也是函数,函数相关的结论对main函数也有效。main(){} 等价 int main(){}int main(void){} 等价 void main(){}void main(void){} 等价 void main(){}....类型语法指向可变数据可变常量指针√×。

m0_72471120的博客 1117

执行HDevelop项目

这一节,我们讲述的是如何用HDevEngine加载和执行一个HDevelop项目。代码部分来源于示例程序exec_program(源文件exec_program.cpp),检测塑料零件边界上的毛刺。1.Step 1:初始化首先,我们包含HALCON/C++和HDevEngine头文件以及命名空间。注意到在这个示例程序中,HDevEngine头文件已经包含在my_hdevoperatorimpl中,所

Z's Palace 2995

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

野指针、空指针

函数功能:C库函数 void * calloc(size_t nitems,size_t size) 分配所需的内存空间,并返回一个指向它的指针。说明:NULL是空常量,它的值是0,这个NULL一般存放在内存中的0x00000000位置,这个地址只能存放NULL,不能被其他程序修改。定义:main函数有多种定义格式,main函数也是函数,函数相关的结论对main函数也有效(也可以定义main函数的函数指针)。返回值类型:void* :该函数返回一个指针,指向已分配大小的内存,如果请求失败,返回NULL。

m0_74973541的博客 1358

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

c语言指针常量和常量指针,详解C语言中的常量指针和指针常量

概述对于新手来说,指针在c语言里总是一个非常难以理解的概念。在这篇文章中,我们将解释常量指针,指针常量,const pointer to const(ps:楼主以为这可以翻译成指向常量的常量指针)的区别常量指针让我们先来理解什么是常量指针。常量指针是指指针指向的地址是常量。换句话说,一旦常量指针指向了一个变量,你不能让该常量指针指向其他变量了常量指针的声明方法如下: * const 常量指针声明示...

weixin_30320587的博客 1789

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C语言中的常量指针与指针常量

<br />1. 常量指针与指针常量是C语言中两个比较容易混淆的概念:<br />(1) const char* p;<br />(2) char* const p=a;<br />(3) char* p="abc";<br />(1)式定义了一个常量指针,即指向一个常量的指针,指向的内容是常量,不可修改,放在常量区的,但指针本身可以修改,即*p='b',是非法的,*p是p指向的常量的第一个字符,是个常量,不能改变的。p=&q这是可以的,指针可以指向不同的地址。<br />(2)式定义了一个指针常量,即指针

4750

main函数,常量指针与指针常量,野指针等,void与void的区别

本文主要介绍了C语言中指针相关的重要概念。首先探讨了main函数的多种定义格式及其特性,包括参数argc和argv的使用方法。然后详细解析了常量指针、指针常量和常量指针常量的区别与应用场景,通过语法对比表总结了它们的特性。接着分析了野指针、空指针和空悬指针的定义、危害及避免措施。最后解释了void与void的区别,强调void作为通用指针类型需要强制转换才能解引用的特点。这些概念对于深入理解C语言指针机制和内存管理至关重要。

Dd000110的博客 995

C语言野指针、规避野指针、assert宏断言

概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。一句话,任何指向非自己管理或者不想指向空间的指针都是野指针。

喜羊羊的博客 1187

C语言:二级指针,常量指针与指针常量

摘要: 本文系统阐述了C语言中指针的核心概念与应用。主要内容包括:1) 二级指针的定义与使用,通过两次解引用访问原始数据;2) 指针与数组的关系,重点分析指针数组与二维数组的区别;3) main函数的标准写法与参数解析;4) 常量指针、指针常量的区别与应用场景;5) 指针安全相关概念(野指针、空指针等);6) void指针的特性与类型转换;7) 内存管理机制,详细解析栈、堆、数据段和代码段的内存特征。文章通过大量代码示例,深入浅出地讲解了指针操作的常见模式与注意事项,对理解C语言内存管理和指针编程具有重要参

wuin129的博客 947

C语言 指针深度解析:从常量指针到函数指针的实战应用

本文深度解析C语言指针的核心概念与应用,重点剖析指针常量与常量指针的关键区别,并通过函数指针实现回调机制等实战案例,帮助开发者掌握指针的高级用法与防御性编程技巧,提升代码安全性与效率。

kiwi8的博客 599

指针、野指针、指针常量、常量指针

指针 概念 指针是什么? 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。 内存地址 字节(byte):字节是内容的容量单位,英文称为byte,一个字节有8位,即1byte = 8bits 字(word):4byte = 1字 半字:2Byte 地址:系统为了便于区分每一个字节而对它们逐一进行

HZS8520223520的博客 1417

C语言 指针用法与区别(指针常量、常量指针、指针函数、函数指针、二级指针)

简单来说,指针就是地址。int a = 10;//p就是变量a的地址我们上述代码进行图解:可以清晰地看到,指针p实际上就是变量a的地址。

qq_42561732的博客 1110

c语言--指针常量,常量指针,多级指针,空指针,野指针

int iinti是一个整型变量。

hhhlll513的博客 455

【C语言】指针常量和常量指针

在多线程编程中,指针常量可以用于确保多个线程访问同一个共享资源时,指针本身的地址不被改变。这种用法在需要访问固定数据结构或配置的场景中尤为重要。在这些用法帮助确保数据的安全性和代码的稳定性,特别是在复杂或多线程的应用程序中。定义:指针指向的内容是常量,不能通过该指针修改内容,但指针本身可以指向其他地址。定义:指针本身是常量,不能指向其他地址,但指针所指向的内容可以改变。两者都是指针,存储方式相同,但使用限制不同。指针常量和常量指针在内存中的存储方式主要区别在于。通过这两种指针的使用限制,可以。

猫猫的小茶馆 1662
上一篇: 程序员裁员潮:技术变革下的职业危机
下一篇: 深度解析指针与数组:探索内存管理的艺术
Srlua小谢
Srlua小谢 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄4年 8963粉丝 332原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值