C:指针学习(1)-学习笔记

news2024/11/27 2:26:46

目录

前言:

知识回顾:

1、const

1.1 const修饰普通变量

1.2 const修饰指针变量

1.3 总结:

2、指针运算

2.1 指针+-整数

2.2 指针-指针

2.3 指针的关系运算

3、指针的使用

结语:


前言:

距离上一次更新关于初识指针的内容已经有一段时间了,本文旨在继续深入探讨指针的相关知识。在引入新的知识点之前,让我们先对之前介绍过的内容进行一个简要的回顾。

上一篇中我们主要介绍了内存和地址,什么是指针、指针变量,指针类型以及void*的用法


知识回顾:

1.内存和地址:内存类似宿舍楼,房间是内存单元,数据是房间里的人,门牌号是地址,计算机通过地址管理内存,编址由硬件设计完成。

2.指针变量和地址:通过(&)取地址操作符获取地址,可将地址存储在指针变量中,指针类型如int 解引用操作符(*)用于操作指针指向的对象,指针变量大小取决于地址大小,与指针类型无关。

3.指针变量类型的意义:指针类型决定了解引用时的权限和指针移动的距离。

4.void*指针:可以接受任意类型地址,但不能直接进行指针运算,常用于存放地址并通过强制类型转换进行解运算。

接下来这篇文章将会讲到一个关键字const,指针运算,以及指针的使用和传址调用


1、const

const是一个关键字,一般用来做两件事:

  1. const修饰普通变量
  2. const修饰指针变量

1.1 const修饰普通变量

#include <stdio.h>
int main()
{
	int n = 0;//变量初始化
	n = 20;//修改变量的值
	printf("%d\n", n);
	return 0;
}

结果:原来是0的值可以修改为20.这就是变量

如果加上const呢?const int n = 0;

当被const修饰后,该程序就无法实现了,为什么呢?

const被称为长属性—被const修饰后的变量就具有长属性,长属性的意思就是不能被修改。

但是如果我们不修改变量的值,直接使用是否可以?

int main()
{
	const int n = 0;
	//n = 20;
	printf("%d\n", n);
	return 0;
}

结果肯定是可以的,被const修饰的变量可以打印,但是当你要修改它的值的时候,程序就无法实现了。

那么被const修改后的变量被认为是变量还是常量呢?

在C语言中,被const修饰后的变量被称为长变量,它的本质还是变量,因为有const修饰,编译器在语法上不允许修改这个变量。

在c++语言中,被const修饰后的变量被称为常量

知道这个有什么用呢?

在C99之前,编译器是不支持变长数组作为数组大小的,因此,这里由于n的本质还是变量,因此无法实现(在C语言上

如果我们改为c++呢?

当我们将文件后缀改为c++后,由于在c++中,被const修饰的变量的本质是常量,所以这里数组的大小就可以使用 n 来表示。

作用:当以后你写一个变量但是不希望别人修改的话,就可以使用const来修饰

注意:const位置放在函数类型(int)的前面或者后面都是可行的,不过习惯上我们都放在前面。

1.2 const修饰指针变量

前面我们说被const修饰后的变量不能被修改,但是如果我们就想要去修改并且还并不想删去const,该怎么办呢?

#include <stdio.h>
int main()
{
	const int n = 0;
	//n = 20;
	int* p = &n;
	*p = 20;
	printf("%d\n", n);
	return 0;
}

上诉代码中,我们通过取到n的地址来修改n的值,是否可行呢?

我们发现可以修改了。

不过,虽然我们得到了想要的结果,但是你们有没有觉得上诉代码有一些奇怪?

我们为什么要在变量n前面加上const呢?不就是为了防止变量n的值被修改吗?但是这里我们又通过指针的方式将n的值修改。这就像现实生活中,我这里有一个房子,你不能翻窗户进去,只能从正门进去,但是某一天呢,我有事不在家,就把房门锁上了,你无法从正门进去了,于是你把窗户砸了,从窗户爬进去了。

上面通过指针的操作就破坏了const修饰变量的目的。

为了防止这种情况,我们就需要用const来修饰指针变量。

我们应该怎么做呢?

const修饰指针变量有三种方式:
int * p

const可以放在*的左边,也可以放在*的右边,也可以左右两边都放上const

不管是const int * p 还是int const * p 都算放在*的左边

三种情况:
1.const放在*的左边:int const * p

2.const放在*的右边:int * const p

3.comst放在*的两边:const int * const p

1. const放在*的左边:int const * p

关于对 p 的理解

int n = 10;

int* p = &n;

p里存放的是n的起始地址,通过p可以找到n,如果像修改n的值,我们无非就是两种方式

一种通过修改p的值来修改n:p = &m ,通过将m的地址给到p,然后修改n的值

另一种通过p找到n来直接修改n的值:*p = 200;

当我们能够对p有这样的理解后,我们在来看 const放在*的左边的时候,限制的是p变量本身,还是p指向的内容。

代码展示:

#include <stdio.h>
int main()
{
	const int n = 0;
	int m = 100;
	const int* p = &n;
	p = &m; //可行
	*p = 100;//不可行
	printf("%d\n", n);
	return 0;
}

可以看到p = &m;是可执行的,而*p = 100;则会报错。

所以当const放在*的左边的时候,限制的是*p,也就是说不能通过p找到n的值来修改n的值

const放在*的左边的意思是:表示指针指向的内容,不能通过指针来改变了,按时指针变量本身的值是可以改的。

2. const放在*的右边:int * const p

int main()
{
	const int n = 0;
	int m = 100;
	 int* const p = &n;
	p = &m; //不可行
	*p = 100;//可行
	printf("%d\n", n);
	return 0;
}

当const放在*的右边后, p = &m是无法执行的。而*p = 100则是可以执行的。说明const放在*的右边限制的是p本身。

const放在*的右边的意思:表示指针变量p本身不可以修改了,但是指针指向的内容是可以通过指针变量来改变的。

如果想限制p,就放在*的右边,如果想限制p所指向的内容,就放在*的左边。

3 .comst放在*的两边:const int * const p

这个意思就是指针变量p不能被修改,指针变量p指向的内容也不能被修改。

1.3 总结:

  • const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本身的内容可变。
  • const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指 向的内容,可以通过指针改变。

2、指针运算

指针的基本运算分为三类,分别是:

  • 指针+-整数
  • 指针-指针
  • 指针的关系运算

2.1 指针+-整数

数组在内存中是连续存放的,因此,只要知道第⼀个元素的地址,顺藤摸瓜就能找到后面的所有元素。

当我们拿到首元素地址,我们可以将后面的都拿到吗?

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;
}

打印结果:

当我们知道数组第一个元素的地址,就可以通过指针加减整数的方式得到其它的元素。

2.2 指针-指针

指针就是地址,所以指针减指针就是地址减地址,那指针减指针有什么用处呢?

指针-指针得到的是两个指针间的元素个数

int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };	
	printf("%d ", &arr[9]-&arr[0]);
	return 0;
}

结果展示;

指针式分大小的,大的指针减小的指针得到的是正数,小的减大的是负数

总结:指针-指针的绝对值是两指针间的元素个数。

前提条件:两个指针指向同一块空间才能相减。也就是需要指向同一个数组才能相减。

2.3 指针的关系运算

在前面介绍数组的时候,有说过一个知识点:数组随着下标的增长,地址是由低到高变化的

比如说我们想打印下面这个数组中的元素

int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };	
	int* p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	while (p < &arr[sz])//p是起始地址,随着下标增长,地址也会变高,因此起始地址肯定低于后面的地址
	{
		printf("%d ", *p);
		p++;
	}	
	return 0;
}

通过大小关系我们可以打印出该数组的所以元素。

3、指针的使用

指针是一种用于存储变量地址的特殊变量,通过它可以间接访问和操作所指向的内存空间中的数据。

通过前面的学习我们也了解了指针的一些相关知识,那么指针的使用包含哪几个方面呢?

1.声明指针:使用特定的类型声明指针变量,比如 int * p;表示声明一个指向整数的指针。

2.赋值:可以将变量的地址赋值给指针,比如 *p = &n;表示将n的地址赋给p,从而改变指针p所指向的值。

3.解引用:通过解引用指针可以访问指针所指向的变量,例如*p = 100;表示将指针所指向的整数赋值为100.

4.指针运算:可以对指针进行加减运算,以移动指针指向不同的内存位置。


结语:

本篇文章主要介绍了一个关键字const修饰变量的作用,以及指针的运算和指针的使用。关于指针的传址调用的介绍,在函数篇那里就已经介绍的比较完善了,如果有想了解了可以看一看。

C语言函数:编程世界的魔法钥匙(1)-学习笔记-CSDN博客

下期再见!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1985549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java语言程序设计——篇十一(6)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

【Python_PySide6学习笔记(三十七)】清空QLayout中所有控件的方法

清空QLayout中所有控件的方法 清空QLayout中所有控件的方法前言正文1、takeAt()方法2、自定义f_clearLayoutFunc()方法3、setParent(None)方法 清空QLayout中所有控件的方法 前言 在 GUI 开发中&#xff0c;当我们使用 PySide6&#xff08;或兼容的PyQt6&#xff09;的 QVBox…

Sol盗u、sol链上的USDT盗窃:警惕恶意智能合约

随着区块链技术的普及&#xff0c;Solana链上的应用和用户数量不断增加。然而&#xff0c;这也为不法分子提供了可乘之机&#xff0c;恶意智能合约逐渐成为盗取USDT等加密资产的一种常见手段。本文将详细介绍恶意智能合约的工作原理&#xff0c;并提供防范措施&#xff0c;帮助…

【OpenCV C++20 学习笔记】Canny边缘检测

Canny边缘检测 原理步骤 API实例 原理 Canny边缘检测也称为“最优检测”(optimal detector)&#xff0c;它的开发主要有以下3个目标&#xff1a; 低错误率&#xff1a;只检测真实存在的边缘良好的定位&#xff1a;检测出来的边缘与真实的边缘之间的距离要达到最小最小的反馈&…

报错Process exited with an error: 1 (Exit value: 1)

问题描述 运行springboot程序&#xff0c;程序报错 Process exited with an error: 1 (Exit value: 1)打开错误描述&#xff0c;发现是端口8080被占用&#xff08;我们的端口号未必一致&#xff0c;改成你报错的端口&#xff09; 问题分析 明确报错内容后&#xff0c;关闭…

SNAT、DNAT 防火墙规则

文章目录 一、SNAT原理与应用案列:1.给服务器和路由器(以liunx替代)做好准备工作(安装iptables和关闭firewalld防火墙)2.如果安装了iptables,设置80端口的访问为允许(liunx1:充当服务器)3.设置ens36网卡的地址为10.0.0.1(liunx2:充当路由器)4.修改liunx1服务器的ip地址和网关5.…

【Android Studio】图标一键生成 Image Asset Studio(一键各机型适配图标生成工具-告别一个一个替换)

文章目录 方法一&#xff1a;原始替换方法二&#xff1a;Image Asset Studio 方法一&#xff1a;原始替换 https://blog.csdn.net/xzzteach/article/details/140821856 方法二&#xff1a;Image Asset Studio 自动替换

易捷OA协同办公系统 ShowPic接口任意文件读取漏洞复现 [附POC]

文章目录 易捷OA协同办公系统 ShowPic接口任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现易捷OA协同办公系统 ShowPic接口任意文件读取漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相…

在当今的大环境下,怎么做好一名嵌入式工程师?

不知不觉2024年已经过了一半了&#xff0c;我在csdn也更新了不少文章&#xff0c;也有很多想说的&#xff0c;没有地方发&#xff0c;想来想去&#xff0c;也就发在这里了&#xff0c;反正也没有多少人看 2024年目前大环境大家都应该很清楚&#xff0c;最新消息&#xff0c;英…

登录页滑块验证图

效果图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> <b…

Omnissa Horizon 8 2406 (8.13) 发布 - 虚拟桌面基础架构 (VDI) 和应用软件

Omnissa Horizon 8 2406 (8.13) 发布 - 虚拟桌面基础架构 (VDI) 和应用软件 之前称为 VMware Horizon, 通过高效、安全的虚拟桌面交付增强您的工作空间 请访问原文链接&#xff1a;https://sysin.org/blog/omnissa-horizon-8/&#xff0c;查看最新版。原创作品&#xff0c;转…

【弱监督时间动作定位】ACGNet: Action Complement Graph Network for WSTAL 论文阅读

ACGNet: Action Complement Graph Network for Weakly-supervised Temporal Action Localization 论文阅读 AbstractIntroductionRelated WorkAction Complement Graph NetworkMethod OverviewAction Complement GraphGraph InferenceTraining Objective ExperimentsConclusion…

广告牌安全隐忧多?撞击震动预警终端,守护城市安全网

据央视新闻最新报道&#xff0c;7月22日晚21时左右&#xff0c;云南省昆明市盘龙区金江路一临街商铺的五楼顶部广告牌突发脱落事故&#xff0c;该意外事件已导致五人受伤&#xff0c;再次为公众安全敲响了警钟。这一事件深刻凸显了加强对城市中各类广告牌及其他悬挂设施安全状态…

夜神模拟器抓取app包

夜神模拟器抓取app包 使用到的工具有 夜神模拟器 kali burp 具体步骤&#xff1a; 1&#xff0c;模拟器设置代理&#xff0c;下载bp的证书 2&#xff0c;利用kali openssl将证书转为可信任证书 3&#xff0c;模拟器开启开发者模式 4&#xff0c;在夜神模拟器终端运行命令安装证…

C# 集合操作的艺术:深入解析数据分区策略与高效筛选技巧(Skip、SkipWhile、Take、TakeWhile)

文章目录 概述Skip 和 SkipWhile 方法Take 和 TakeWhile 方法综合应用示例总结 在C#中&#xff0c;LINQ&#xff08;语言集成查询&#xff09;提供了一种非常方便的方式来处理数据集合。本文将详细介绍四种数据分区方法&#xff1a;Skip、SkipWhile、Take、TakeWhile&#xff0…

2024固态选购指南,可以买贵的但不能买贵了

前两天谈到三星后院“起火”&#xff0c;也就是大规模半导体工人罢工&#xff0c;有一部分同学就焦虑起来了。 怕内存和固态近期涨价&#xff0c;纷纷发私信询问配置问题&#xff0c;阿红也大致看了下&#xff0c;大件搭配方面大家都没啥问题了&#xff0c;但唯独在众多固态硬…

萤石网络获评“2024最具价值科创板上市公司”

近日&#xff0c;在科创板开市五周年峰会上&#xff0c;由权威媒体《科创板日报》与财联社联合发起的“科创板开市五周年评选”榜单正式揭晓&#xff0c;萤石网络成功入选“2024最具价值科创板上市公司”榜单。 “2024最具价值科创板上市公司”榜单通过对500余家上市公司业务创…

python: 多进程实例

1. 实例一 主进程跟子进程的通过两个队列实现全双工通信&#xff1b;如有需要主进程会提示窗口输入信息传输给子进程&#xff1b;如果子进程收到主进程的消息&#xff0c;会弹窗提示收到的消息&#xff1b;子进程弹窗提示进程即将结束&#xff1b; 详细代码如下 # -*- coding…

电脑监控软件超全盘点!效率与隐私完美平衡!五款软件轻松实现企业级电脑屏幕管控!

企业对电脑监控软件的需求日益增长&#xff0c;旨在提升工作效率、保障数据安全并维护良好的工作环境。但&#xff0c;如何在提升管理效率的同时&#xff0c;尊重并保护员工的个人隐私&#xff0c;成为了企业选择监控软件时必须慎重考虑的问题。本文将为您盘点五款能够完美平衡…

从报名到领证:软考初级【网络管理员】报名考试全攻略

本文共计13189字&#xff0c;预计阅读30分钟。包括七个篇章&#xff1a;报名、准考证打印、备考、考试、成绩查询、证书领取及常见问题。 一、报名篇 报名条件要求&#xff1a; 1.凡遵守中华人民共和国宪法和各项法律&#xff0c;恪守职业道德&#xff0c;具有一定计算机技术…