【C语言】指针进阶[上] (字符、数组指针、指针数组、数组传参和指针传参)

news2024/10/5 13:56:26

简单不先于复杂,而是在复杂之后。

89efcc89ac61428db4d5b6639b2bd948.jpeg 

目录

1. 字符指针 

面试题 

2. 指针数组 

3. 数组指针 

3.1 数组指针的定义

3.2 &数组名 VS 数组名 

3.3 数组指针的使用 

4. 数组参数、指针参数 

4.1 一维数组传参 

4.2 二维数组传参 

4.3 一级指针传参 

4.4 二级指针传参 


 

1. 字符指针 

指针的概念:

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

2. 指针的大小是固定的4/8个字节(32位平台/64位平台)

3. 指针是有类型的,指针的类型决定了指针+-整数的步长,指针解引用的权限。

4. 指针运算

 

 

在指针的类型中有一种类型叫字符指针char*

 

所以在我们敲代码的时候,把常量字符串首字符地址赋给指针变量的时候,最好前面加上const,保护字符串不被更改

面试题 

 

 

 

2. 指针数组 

 

 

 

 

首先,我们定义了3个整型数组,arr1、arr2、arr3,并使用指针数组存储了这三个数组首元素的地址,然后用两层循环打印出这三个数组的所有元素。

外层循环控制数组的遍历,内层循环控制数组中每个元素的访问。

在内层循环中,通过 parr[i][j] 访问第 i 个数组的第 j 个元素,然后用 printf 输出元素的值。 

注释部分的 *(p+i) == p[i] 

这句注释解释了指针数组 parr 的用法。

parr 是一个指针数组,定义为 int* parr[3] ,int表示数组中存储的是指向 int 类型的指针。

由于指针数组的本质就是一个数组,所以可以使用 *(p+i) == p[i] 的方式访问数组 parr中的元素,它们的含义是相同的,都表示取出第 i 个元素(第 i 个数组首元素的地址)。

注释部分的printf("%d ", *parr[i] + j);

这行代码的含义是用指针方式访问数组元素。

*parr[i] 表示取出第 i 个数组的首元素的值,然后将其加上 j ,表示访问第 i 个数组的第 j 个元素的值。

这种方式和 parr[i][j]是等价的,但是后者比较直观。

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

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

//0 1 2
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
//*(p+i) == p[i]

//printf("%d ", * parr[i] + j);
printf("%d ", parr[i][j]);               
}
printf("\n");
}

return 0;
}

3. 数组指针 

3.1 数组指针的定义

 

int (*p)[10];

解释:

p先和*结合,说明p是一个指针变量,然后指针指向的是一个大小为10个整型的数组。 

所以p是一个指针,指向一个数组,叫做数组指针。

注:[ ]的优先级高于* ,必须加上()来保证p先和*结合。

3.2 &数组名 VS 数组名 

 

 

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

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

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

 

 

 

数组指针在定义的时候,C语言的规范要求必须指定数组的数据类型元素个数。

数组指针中的[ ]的值必须与它指向数组的元素个数相等。

在vs跑代码的时候我发现,vs2019对这方面检测不严格,可以跑,但是在事实上却有很大的隐患,所以在我们敲代码的时候要注意代码规范。

如果[ ]中的值与实际数组元素个数不同,可能会导致访问越界或内存泄露等问题。

如果[ ]中不写值,有时编译器会报错,因为它无法确定指针指向的数组的大小。

 这是错误别扭的写法,最好不要这样用。

 这是简洁清晰的写法。

3.3 数组指针的使用 

既然数组指针指向的是数组,那数组指针存放的应该是数组的地址。

 

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

void print1(int arr[3][5], int r, int c)
{
	int i = 0;
	for (i = 0; i < r; i++)
	{
		int j = 0;
		for (j = 0; j < c; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}

void print2(int(*p)[5], int r, int c)
{
	int i = 0;
	for (i = 0; i < r; i++)
	{
		int j = 0;
		for (j = 0; j < c; j++)
		{
			printf("%d ", *(*(p + i) + j));
		}
		printf("\n");
	}
}

int main()
{
	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
	print1(arr, 3, 5);
	print2(arr, 3, 5);

	return 0;
}

 

 这两种写法都是可以的。

 

 ​​​​​​​

 

 

4. 数组参数、指针参数 

在写代码的时候要把【数组】和 【指针】传给函数,接下来我们学习函数的参数如何设计。

4.1 一维数组传参 

 

4.2 二维数组传参 

 

4.3 一级指针传参 

 

 

4.4 二级指针传参 

 

 

 

 

 

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

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

相关文章

数据预处理(Data Preprocessing)

Data Preprocessing 前言Why preprocess?Major Tasks in Data PreprocessingData CleaningIncomplete (Missing) DataWhat to Consider When Handling Missing Data?MCARMARMNAR How to Handle Missing Data - ImputationMore on ImputationEven More on ImputationPreproces…

K-Means和轮廓系数

K-Means和轮廓系数 K-means&#xff08;K均值&#xff09;是机器学习中一种常见的无监督算法&#xff0c;它能够将未知标签的数据&#xff0c;根据它们的特征分成不同组&#xff0c;每一组数据又称为“簇”&#xff0c;每一簇的中心点称为“质心”。其基本原理过程如下&#x…

【LeetCode】数据结构题解(3)[查找链表中倒数第k个节点]

查找链表种倒数第k个节点 1.题目来源2.题目描述3.解题思路4.代码展示 所属专栏&#xff1a;玩转数据结构题型 博主首页&#xff1a;初阳785 代码托管&#xff1a;chuyang785 感谢大家的支持&#xff0c;您的点赞和关注是对我最大的支持&#xff01;&#xff01;&#xff01; 博…

走进Dart虚拟机:深入理解高效卓越的运行机制

Dart虚拟机概述 Dart虚拟机是运行Dart代码的主要工具之一。Flutter框架使用Dart作为开发语言&#xff0c;因此Dart虚拟机在Flutter中扮演了非常重要的角色。 Dart虚拟机是一种解释器&#xff0c;它能够解释和执行Dart代码。Dart代码在虚拟机中被编译成字节码&#xff0c;然后…

windows开机启动软件、执行脚本,免登录账户

文章目录 前言一、打开任务计划程序1.我电脑上的是点搜索“任务计划程序”&#xff0c;可能每个电脑的搜索按钮不一样&#xff0c;自行查找2.打开后应该是长这样的 二、创建文件夹1.点击任务计划程序库、右键选择新建文件夹2.名字顺便&#xff0c;点击确定3.创建后如图、点击目…

Aspose.Slides for .NET V23 Crack

Aspose.Slides for .NET V23 Crack 现在&#xff0c;您可以在将演示文稿保存为HTML时保留文档缩放。 Aspose.Slides for.NET是一个演示文稿处理API&#xff0c;使应用程序能够读取、写入、修改和转换Microsoft PowerPoint演示文稿。作为一个独立的API&#xff0c;它提供了管理P…

【马蹄集】第八周作业

第八周作业 目录 MT2016 数据流的中位数MT2017 连续的串MT2027 一秒成零MT2033 碰碰车MT2036 移水造海 MT2016 数据流的中位数 难度&#xff1a;黄金  时间限制&#xff1a;1秒  占用内存&#xff1a;128M 题目描述 对于数据流问题&#xff0c;小码哥需要设计一个在线系统&…

RK3568芯片开发笔记——调试pwm控制红外功能

1、PWM介绍 参考博客&#xff1a;《ARM芯片开发&#xff08;S5PV210芯片&#xff09;——定时器、看门狗、RTC》&#xff1b; 2、配置pwm功能的方法 (1)内核层&#xff1a;内核代码里有pwm子系统&#xff0c;里面有pwm相关函数接口&#xff0c;如果是驱动代码里要操作pwm就需要…

从0搭建Vue3组件库(七):使用 gulp 打包组件库并实现按需加载

使用 gulp 打包组件库并实现按需加载 当我们使用 Vite 库模式打包的时候,vite 会将样式文件全部打包到同一个文件中,这样的话我们每次都要全量引入所有样式文件做不到按需引入的效果。所以打包的时候我们可以不让 vite 打包样式文件,样式文件将使用 gulp 进行打包。那么本篇文…

FBEC大会 | 瑞云科技 CTO 赵志杰:元宇宙时代的基础设施——实时云渲染

​ FBEC未来商业生态链接大会于2023年2月24日在深圳福田大中华喜来登酒店盛大召开&#xff0c;本次大会由广东省游戏产业协会、深圳市互联网文化市场协会指导&#xff0c;陀螺科技主办。 大会以“勇毅前行逐光而上”为主题&#xff0c;以具有行业前瞻洞察的“探索者”为视角&a…

docker以外挂目录的方式部署springboot项目

前置准备&#xff1a; 清单&#xff1a; 安装有docker的Linuxspringboot打包的jar文件&#xff08;该项目只有一个返回"hello world"接口&#xff09; Linux的IP地址&#xff1a;192.168.221.129 springboot项目的接口&#xff1a; 1、上传jar文件至Linux 我上传…

基于springboot的前后端分离的案列(一)

SpringBootWeb案例 前面我们已经讲解了Web前端开发的基础知识&#xff0c;也讲解了Web后端开发的基础(HTTP协议、请求响应)&#xff0c;并且也讲解了数据库MySQL&#xff0c;以及通过Mybatis框架如何来完成数据库的基本操作。 那接下来&#xff0c;我们就通过一个案例&#xf…

ArcGIS三体阴影(影像三维)显示马赛克?

我们经常基于ArcGIS通过DEM来做山体阴影 但是有时候你一放大就会出现很强的马赛克的效果 还有我们在利用ArcScene建三维场景 即使数据分辨率很高也会出现马赛克效果 那怎么来解决这个问题呢 让我们的山体阴影显示更加细腻 三维没有马赛克的效果呢&#xff1f; 右键图层选择如…

Java线程间通信方式

前文了解了线程的创建方式和状态切换&#xff0c;在实际开发时&#xff0c;一个进程中往往有很多个线程&#xff0c;大多数线程之间往往不是绝对独立的&#xff0c;比如说我们需要将A和B 两个线程的执行结果收集在一起然后显示在界面上&#xff0c;又或者比较典型的消费者-生产…

Linux内核进程管理与调度:策略优化与实践分析

Linux内核进程管理与调度 一、前言二、进程管理和多进程调度2.1 进程标识符和控制块2.2 进程状态和转换2.3 进程间通信 三、单处理器下的Linux进程调度3.1 Linux进程调度器3.2 时间片轮转调度算法3.3 最短剩余时间优先调度算法3.4 其他调度算法的不足 四、多处理器下的Linux进程…

【数据结构 ---基于C语言预备知识】

数据结构 ---基于C语言预备知识 一、对数据结构这门课的基础认识1.1 数据结构的定义&#xff1a;1.2 衡量算法的标准&#xff1a;主要的是1&#xff0c;21.3 数据结构的特点和地位&#xff1a; 二、预备知识&#xff1a;2.1 内存概念&#xff1a;2.2 预备知识指针&#xff08;复…

每日学术速递4.23

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.LiDAR-NeRF: Novel LiDAR View Synthesis via Neural Radiance Fields 标题&#xff1a;LiDAR-NeRF&#xff1a;通过神经辐射场的新型 LiDAR 视图合成 作者&#xff1a;Tang Tao, …

pytest 学习三(前置后置操作)

pytest测试框架_pytest框架-CSDN博客 一、常用的操作 一、setup/teardown 每个用例之前、之后执行 二、setup_class/teardown_class 在每个类之前、之后执行一次 二、pytest.fixture 设置前置后置操作范围 pytest.fixture(scope"",params,autouse,ids,name) 其中 sc…

TVM- End-to-End Optimization Stack for Deep Learning

TVM- End-to-End Optimization Stack for Deep Learning 引言 TensorFlow、MXNet、Caffe 和 PyTorch 等可扩展框架推动了深度学习当前的普及和实用性。然而&#xff0c;这些框架针对范围较窄的服务器级 GPU 进行了优化&#xff0c;将工作负载部署到其他平台&#xff08;例如手…

SpringBoot中@EnableAsync和@Async注解的使用

目录 1.EnableAsync 注解1.1 配置类使用示例1.2 复制请求上下文 2.用法1&#xff1a;Async 注解2.1 测试Controller2.2 测试Service2.3 测试ServiceImpl2.4.测试 4.用法2&#xff1a;直接使用 taskExecutor 做异步4.1 重新实现&#xff1a;测试ServiceImpl4.2 测试 5.Async异步…