指针的进阶(C语言)(上)

news2024/11/25 20:06:51

目录

 

前言

1、字符指针

2、指针数组

3、数组指针

3.1数组指针的定义

3.2 数组名VS&数组名

3.3数组指针的运用


 

前言

        对于指针,我们已经有了初步认识(可以看我写的指针详解那一篇文章)。

简单总结一下基本概念:

        1、指针就是一个变量,用来存放地址,地址唯一标识一块空间。

        2、指针的大小是4/8个字节(32位平台为4字节,64位平台为8字节)

        3、指针是有类型的,指针的类型决定了指针的+-的步长以及指针解引用操作时候计算机如何看待指针所指向的内容。

        4、指针的运算(指针+-常数;指针-指针;指针与指针的比较)

        对于基本概念了解后,现在我们进行指针进阶,对指针进行进一步的深入分析。

1、字符指针

        举例两种用法:

        第一种,指向字符变量,可以操作字符变量。

#include<stdio.h>
int main()
{
	char ch = "w";
	char* pc = &ch;
	*pc = 'b';
	printf("%c\n", ch);
	return 0;
}

        还有一种,指向字符串。

#include <stdio.h>
int main()
{
	const char* p = "abcdef";
	printf("%s\n", p);
	return 0;
}

        第二种用指针指向字符串,实际上是把字符串首元素的地址传给了指针变量。而对于常量符串来说,其内容不可被更改,因此用const'修饰*p表示*p的无法更改。

        看一个例子:

        218fac19768241da8d321091fb89cb83.png

        原因:对于常量字符串,放在内存的只读数据区里面,这个空间只能读不能写,只能用不能改变其内容,对于同样的常量字符串,会放在同一个地址,因此p1和p2指向同一个地址,因此p1==p2。

        但是对于arr1和arr2来说,它们是被创建的两个数组,自然会在内存中开辟不同的地址,“abcdef”只不过是对其的初始化而已。所以这两个数组的首元素地址是不同的。

2、指针数组

        是数组,是用来存放指针的数组。

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };

	int* parr[3] = { arr1,arr2,arr3 };

	int i = 0;
	int j = 0;
	for (i = 0;i < 3;i++)
	{
		for (j = 0;j < 5;j++)
		{
			printf("%d ", *(parr[i] + j));
		}
		printf("\n");
	}

	return 0;
}

        parr就是一个指针数组,它的内部存放了三个地址。

04590e1c381f466c9d300feb26e6d8fe.png

        对每个地址进行访问,就能打印出所有元素的值。其实对于指针数组来讲,它其实是模拟了一个二维数组。访问时可以直接用parr[i][j];效果完全相同。

3、数组指针

        是指针,是指向数组的指针。

3.1数组指针的定义

        int* p1[10];                       p1是指针数组

        int (*p2)[10];                    p2是数组指针

       p2数组指针可以指向一个数组,该数组有10个元素,每个元素是int类型

        要将明白数组指针,必须要先弄懂数组名的概念。

3.2 数组名VS&数组名

        数组名通常表示的是首元素的地址,但是有两个例外:

        1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。

        2.&数组名,这里的数组名表示的依然是整个数组,所以&数组名取出的是整个数组的地址

2f229ab0ea2f4384b1e4d59339de58e4.png

        &数组名从值上来看,和数组名是一样的,都表示了数组首元素的地址,但是,他们的区别是什么?我们都加一看看。

  、a9dfb1c97571497d906dc5711c4c7b81.png

        我们发现,arr加1加了4,而&arr加1加了40。由此我们知道,&数组名之后,它会表示整个数组的地址,+1直接跳过整个数组。

        那么想&arr这样的数据,如果我们想用变量去存放它,我们该用什么变量去存放它呢。答案就是数组指针。“数组指针就是指向数组的指针”,这样我们便理解了这句话。

int(*p2)[10] = &arr;

        这样去定义就能存放&arr,不加括号p2会优先和[]结合成为数组,因此需要用括号将*和p2括起来,确保其是一个指针,后面[]中放的数是arr的元素个数。int指的是arr元素的类型。

3.3数组指针的运用

         b7c35cddf7934d7b940973d268528b57.png

        这是一个运用的例子,有几个要注意的点。1、在定义数组指针时,[]中必须指明数组的元素个数。2、在输出时,一定要将*p用()括起来,不然p会优先和[]结合,变成野指针。

        但是我们一般不这么使用,因为用指针访问数组只需要用*p指向arr就好了。

        数组指针不是应用在这种情况的,数组指针一般运用在二维及以上的数组处理。

1aca081dcdf34b2c8a698305a0ffa00c.png

        这个例子告诉我们,当函数传参时二维数组时,形参可以用数组指针去接收。这样去使用数组指针是最舒适的。

 

        到此,指针进阶(上)结束,后面还有一篇进行讲解,还包括的内容有函数传参如何用指针接收、函数指针、函数指针数组、指向函数指针数组的指针、回调函数。

 

 

 

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

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

相关文章

C# Winfrom实例:武汉智能安检闸机数据接收和解析

项目介绍&#xff1a;本实例主要是接收安检闸机的数据解析并显示到界面上&#xff0c;只做功能实现&#xff0c;不做界面美化 硬件&#xff1a;闸机一个、网线一根、电脑主机开发环境&#xff1a;vs2017 系统&#xff1a;win10涵盖知识点&#xff1a;tcp通讯、文件写入、多线程…

通过Linux终端搭建基于HTTP隧道的文件传输系统

嘿&#xff0c;Linux小侠们&#xff0c;准备好挑战一项酷炫的任务了吗&#xff1f;今天我们要一起通过Linux终端搭建一个基于HTTP隧道的文件传输系统&#xff0c;让我们的文件在网络的海洋中畅游无阻&#xff01; 在开始之前&#xff0c;让我们先来想象一下这个场景&#xff1…

吃个桃桃~

解法&#xff1a;暴力、排序 #include <iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std; #define endl \n struct tree {int index;int peach; }; bool cmp(tree a,tree b) {if (a.peach ! b.peach)return …

提升数据库操作技能:发现MyBatis-Plus学习网站的无限可能!

介绍&#xff1a;MyBatis-Plus是一个对MyBatis框架进行增强的工具&#xff0c;旨在简化开发流程并提升开发效率。以下是MyBatis-Plus的一些主要特点&#xff1a; CRUD操作简化&#xff1a;MyBatis-Plus提供了一些列的CRUD操作方法&#xff0c;这些方法已经封装好&#xff0c;可…

计算机服务器中了devos勒索病毒怎么办?Devos勒索病毒解密数据恢复

网络技术的不断发展与更新&#xff0c;为企业的生产运营提供了有利保障&#xff0c;企业的生产运营离不开数据支撑&#xff0c;通过企业数据可以综合调整发展运营方向&#xff0c;但网络是一把双刃剑&#xff0c;近期&#xff0c;云天数据恢复中心接到许多企业的求助&#xff0…

文件系统创建分区

目录 一、EXT4文件系统创建分区 1.使用 fdisk 分区 2.格式化写入文件系统 3.挂载 临时挂载 永久挂载 二、XFS文件系统创建分区 1.使用 gdisk 分区 2.格式化写入文件系统 3.挂载 临时挂载 永久挂载 三、创建swap分区 1.查看文件系统 2.新建swap分区 3.格式化分区 …

CSP-202006-2-稀疏向量

CSP-202006-2-稀疏向量 【60分思路-暴力枚举】 显然u[100000000], v[100000000]过不了7,8,9,10的样例&#xff0c;但是思路也比较简单易懂&#xff0c;初学者可以参考 #include <iostream> using namespace std; int u[100000000], v[100000000]; long long inner; in…

Java中的关键字

✨✨ 所属专栏&#xff1a; Java基石&#xff1a;深入探索Java核心基础✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; Java中的关键字是一些具有特殊含义的单词&#xff0c;它们在语法中有特定的用途&#xff0c;不能用作标识符&am…

ai写作工具哪具好,3款AI写作软件来揭晓

ai写作工具在当今信息爆炸的时代中正变得越来越受欢迎。随着人工智能技术的不断发展&#xff0c;越来越多的AI写作软件涌现出来&#xff0c;它们的功能和性能也日益完善。在这篇文章中&#xff0c;我们将揭晓3款备受推崇的AI写作软件&#xff0c;探讨它们各自的特点和优势。 第…

网络机顶盒哪个好?内行分享网络机顶盒排名

网络机顶盒是电视机的必备搭配&#xff0c;依然是不可缺少的部分&#xff0c;我作为网络机顶盒的从业者&#xff0c;经常给被问到的就是网络机顶盒哪个好&#xff0c;不同品牌之间差异较大&#xff0c;今天给大家分享业内最新发布的网络机顶盒排名&#xff0c;看看目前哪些网络…

前端简单知识复习

1.symbol类型 Symbol 是 ECMAScript 6 中引入的一种新的基本数据类型&#xff0c;它表示独一无二的值。Symbol 值是通过 Symbol() 函数创建的。 Symbol 值具有以下特点&#xff1a; 独一无二性&#xff08;唯一性&#xff09;&#xff1a;每个通过 Symbol() 函数创建的 Symb…

泛微e-office系统存在敏感信息泄露 附POC软件

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 泛微e-office系统简介 微信公众号搜索:南风漏洞复…

阿里云国际-在阿里云服务器上快速搭建幻兽帕鲁多人服务器

幻兽帕鲁是最近流行的新型生存游戏。该游戏一夜之间变得极为流行&#xff0c;同时在线玩家数量达到了200万。然而&#xff0c;幻兽帕鲁的服务器难以应对大量玩家的压力。为解决这一问题&#xff0c;幻兽帕鲁允许玩家建立专用服务器&#xff0c;其提供以下优势&#xff1a; &am…

Ubuntu22部署MySQL5.7详细教程

Ubuntu22部署MySQL5.7详细教程 一、下载MySQL安装包二、安装MySQL三、启动MySQL检查状态登录MySQL 四、开启远程访问功能1、允许其他主机通过root访问数据库2、修改配置文件&#xff0c;允许其他IP通过自定义端口访问 五、使用Navicat连接数据库 默认情况下&#xff0c;Ubuntu2…

Python urllib模块学习

HTTP协议 HTTP 协议&#xff1a;一般指HTTP(超文本传输)协议。 HTTP是为Web浏览器和Web服务器之间的通信而设计的&#xff0c;基于TCP/IP通信协议嘞传递数据。 HTTP消息结构 客户端请求消息 客户端发送一个HTTP请求到服务器的请求消息包括以下格式 请求行(request line)请求…

python毕设选题 - 大数据二手房数据爬取与分析可视化 -python 数据分析 可视化

# 1 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通…

什么是HTTP代理,socks5代理?它们的区别是什么?

什么是HTTP代理&#xff1f; HTTP代理是一种常见的网络代理方式&#xff0c;它通过在客户端和服务器之间建立一个中间层&#xff0c;将客户端的请求转发给服务器&#xff0c;并将服务器的响应返回给客户端。HTTP代理通常用于访问受限制的网站&#xff0c;或者在网络中隐藏客户…

以太网通讯工业RFID读写器|传感器RH623A安装方法与注意事项

以太网通讯工业RFID读写器|传感器RH623A是一款支持MODBUS-TCP工业以太网&#xff0c;MODBUS-RTU(RS232)工业总线型高频读写设备&#xff0c;支持ISO15693协议&#xff0c;最高支持3米/秒的相对速度下准确读卡不漏读&#xff0c;满足根类工业环境下应用&#xff0c;广泛应用于AG…

WebGL中开发科学数据可视化应用

WebGL在科学数据可视化领域有广泛的应用&#xff0c;可以用于呈现和解释复杂的科学数据。以下是在WebGL中开发科学数据可视化应用时的一些建议&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.选择合…

多目图像拼接算法

图像拼接一般要经过图像特征提取、特征匹配、融合等步骤来实现。 特征匹配与变换: SIFT(尺度不变特征变换)SURF(加速鲁棒特征)ORB(Oriented FAST and Rotated BRIEF)AKAZE(加速的KAZE特征)全景图像拼接算法: 基于特征匹配的拼接:利用特征点匹配找到重叠区域,然后进…