指针的介绍3前

1.字符指针变量

1.1介绍

	char arr[] = "abcdef";char* p = arr;

上面的代码中,我创建了 字符数组 arr 来存储一个字符串

此时,我可以创建一个指针变量对这个字符串进行相应的修改

我也可以创建一个指针变量指向一个字符串:

char* p = "abcdef";

此时,p指向的是字符串首元素,即字符'a'

 但值得注意的是:这是一个常量字符串

(1)定义:

常量字符串(Constant String)是指存储在程序内存中的一段不可修改的字符序列

(2)形式:

常量字符串通常使用双引号("")括起来,并自动在末尾添加一个空字符('\0')作为字符串的结束标志

此时,我不能通过指针变量,对该字符串进行修改

 程序能够编译通过,但是却会运行崩溃,编译器未显示错误

这是因为,上段代码的语法并未发生错误,只是规则不允许,导致程序崩溃

解决办法:使用const 进行修饰

const char* p = "abcdef";
这样编译器就会报错误,省去了自己去寻找错误的时间

 总结:

(1)常量字符串不可被修改

(2)字符数组可以用来存储可修改的字符串

(3)字符指针指向一个常量字符串的时候,存储的是字符串首元素的地址

1. 2练习

void test()
{char str1[] = "hello zl_dfq.";char str2[] = "hello zl_dfq.";const char *str3 = "hello zl_dfq.";const char *str4 = "hello zl_dfq.";if(str1 ==str2)printf("str1 and str2 are same\n");elseprintf("str1 and str2 are not same\n");if(str3 ==str4)printf("str3 and str4 are same\n");elseprintf("str3 and str4 are not same\n");
}

解析:

创建了 str1 和 str2 两个字符数组

虽然两个数组存放的内容相同

很显然不同数组所占据的存储空间不同

所以数组首元素的地址不同(str1 != str2)

str3 和 str4 指向的是一个常量字符串

并且,字符串内容相同

因为常量字符串只能读,不能被修改

所以内存中没必要存储两份相同的常量字符串

所以,str3 == str4

 2.数组指针变量

2.1引入

我们知道

整型指针是一种指针,它指向的是整型

字符指针是一种指针,它指向的是字符型

所以

数组指针是一种指针,它指向的是数组

这是一个指针数组

表达的含义是该数组存放着10个 int* 类型的指针

int * p[10];

这是一个数组指针

表达的含义是该指针指向一个类型为 int [10] 的数组

int (*p)[10];

 

记忆::[]的优先级要⾼于*,所以必须加上()来保证p先和*结合

如果不加(),标识符会先与[]结合,构成一个数组

2.2初始化

数组指针,指向的是一个数组,就是要存储一个数组的地址

程序运行证明,初始化正确!

(+1 操作后,地址相同)

3.二维数组传参的本质

void test(int arr[3][2])
{arr[0][0] = 10;printf("%d\n", arr[0][0]);
}
int main()
{int arr[3][2] = { {1,2},{3,4},{5,6} };printf("%d\n", arr[0][0]);test(arr);return 0;
}

观察上面的代码,

传入二维数组的数组名之后,我们就可以根据数组名,对二维数组的内容进行相应的修改

(1)

所以:我们传入的是一个(数组名)地址,

这是一个二维数组首元素的地址

而函数则是用一个指针来接收这个地址

因为,只有这样函数才可以通过指针去修改二维数组中相应的值

那这个指针是什么类型呢?

我们知道,

二维数组的本质是:一维数组的数组

即,将一个个一维数组看作一个个元素

所以,二维数组首元素就是二维数组中的第一个一维数组

那么,二维数组首元素的地址就是第一个一维数组的地址

所以这是一个数组指针

void test(int (*arr)[2]);
void test(int arr[3][2]);

上面的代码就完全等效 ,验证如下:

void test(int (*arr)[2])
{arr[0][0] = 10;printf("%d\n", arr[0][0]);
}
int main()
{int arr[3][2] = { {1,2},{3,4},{5,6} };printf("%d\n", arr[0][0]);test(arr);return 0;
}

 

总结:

⼆维数组传参,形参的部分可以写成数组,也可以写成指针形式。

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

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

相关文章

Scrapy如何设置iP,并实现IP重用, IP代理池重用

前置知识 1/3乐观锁 2/3 Scrapy流程(非全部) 3/3 关于付费代理 我用的"快代理", 1000个ip, 每个ip1min的有效期, 你用的时候, 把你的链接, 用户名填上去就行 设置代理IP 🔒 & 帮助文档: ①meta ②meta#proxy$ 语法: ①proxy的设置: Request对象中…

gesp(C++六级)(7)洛谷:P10376:[GESP202403 六级] 游戏

gesp(C六级)(7)洛谷:P10376:[GESP202403 六级] 游戏 题目描述 你有四个正整数 n , a , b , c n,a,b,c n,a,b,c,并准备用它们玩一个简单的小游戏。 在一轮游戏操作中,你可以选择将 n n n 减去 a a a&am…

es数据同步

Logstash 是 Elastic 技术栈中的一个技术,它是一个数据采集引擎,可以从数据库采集数据到 ES 中。可以通过设置 自增 ID 主键 或 更新时间 来控制数据的自动同步: 自增 ID 主键:Logstatsh 会有定时任务,如果发现有主键…

【16届蓝桥杯寒假刷题营】第2期DAY5

5.变变数组 - 蓝桥云课 给定一个长度为 n 的整数数组 A,A 中第 i 个元素为 Ai​(1≤i≤n),你只能在 A 中选择一个元素 a,将 A 中所有数值等于 a 的元素变为 a2,请问变化后 A 中所有元素和的最大为多少。 …

【flutter版本升级】【Nativeshell适配】nativeshell需要做哪些更改

flutter 从3.13.9 升级:3.27.2 nativeshell组合库中的 1、nativeshell_build库替换为github上的最新代码 可以解决两个问题: 一个是arg("--ExtraFrontEndOptions--no-sound-null-safety") 在新版flutter中这个构建参数不支持了导致的build错误…

论文阅读(十五):DNA甲基化水平分析的潜变量模型

1.论文链接:Latent Variable Models for Analyzing DNA Methylation 摘要: 脱氧核糖核酸(DNA)甲基化与细胞分化密切相关。例如,已经观察到肿瘤细胞中的DNA甲基化编码关于肿瘤的表型信息。因此,通过研究DNA…

thinkphp6+swoole使用rabbitMq队列

安装think-swoole安装 composer require php-amqplib/php-amqplib,以支持rabbitMq使用安装rabbitMq延迟队列插件 安装 rabbitmq_delayed_message_exchange 插件,按照以下步骤操作: 下载插件:https://github.com/rabbitmq/rabbitmq-delayed-…

SpringBoot+Electron教务管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.查询课程表代码2.保存学生信息代码3.用户登录代码 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SpringBootElectron框架开发的教务管理系统。首先&#xff…

STM32 LED呼吸灯

接线图: 这里将正极接到PA0引脚上,负极接到GND,这样就高电平点亮LED,低电平熄灭。 占空比越大,LED越亮,占空比越小,LED越暗 PWM初始化配置 输出比较函数介绍: 用这四个函数配置输…

RAG是否被取代(缓存增强生成-CAG)吗?

引言: 本文深入研究一种名为缓存增强生成(CAG)的新技术如何工作并减少/消除检索增强生成(RAG)弱点和瓶颈。 LLMs 可以根据输入给他的信息给出对应的输出,但是这样的工作方式很快就不能满足应用的需要: 因…

docker 部署 java 项目详解

在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署。今天我们以若依项目为例,总结下部署项目的整体流程。简单来说,第一步:安装项目所需的中间件;第二步&#xff1…

【C++】STL介绍 + string类使用介绍 + 模拟实现string类

目录 前言 一、STL简介 二、string类 1.为什么学习string类 2.标准库中的string类 3.auto和范围for 4.迭代器 5.string类的常用接口说明 三、模拟实现 string类 前言 本文带大家入坑STL,学习第一个容器string。 一、STL简介 在学习C数据结构和算法前,我…

使用 MSYS2 qemu 尝鲜Arm64架构国产Linux系统

近期,我的师弟咨询我关于Arm64架构的国产CPU国产OS开发工具链问题。他们公司因为接手了一个国企的单子,需要在这类环境下开发程序。说实在的我也没有用过这个平台,但是基于常识,推测只要基于C和Qt,应该问题不大。 1. …

电路研究9.2.3——合宙Air780EP中FTP——FTPGET 命令使用方法研究

怎么说呢,之前也是看的,但是也很迷茫,感觉上虽然是对的,但是无法联系到应用里面,今天研究一下FTP 命令使用方法吧。 15.29 使用方法举例 这里发现下面那些看的不懂呢,于是就返回FTP的应用了。 9.5.4 FTP 应…

Linux常见问题解决方法--1

常见安全工具、设备 工具 端口及漏洞扫描:Namp、Masscan 抓包:Wireshark,Burpsuite、Fiddler、HttpCanary Web自动化安全扫描:Nessus、Awvs、Appscan、Xray 信息收集:Oneforall、hole 漏洞利用:MSF、…

项目部署(springboot项目)

1、安装Nginx,并开启 2、前端项目打包:npm run build:prod--->dist 3、后端项目打包:install--->xxx.jar 4、开放需要的端口号:比如我的后端项目端口号为8282,则需要防火墙和服务器同时开发8282端口 5、将di…

单细胞分析基础-第一节 数据质控、降维聚类

scRNA_pipeline\1.Seurat 生物技能树 可进官网查询 添加链接描述 分析流程 准备:R包安装 options("repos"="https://mirrors.ustc.edu.cn/CRAN/") if(!require("BiocManager")) install.packages("BiocManager",update = F,ask =…

智能客服系统:结合 AI 模型与数据库实现对话与知识检索

智能客服系统在现代企业中起着至关重要的作用。通过结合 生成式 AI 模型 和 向量数据库,可以构建一个能够高效回答用户问题、支持知识检索并实现对话连续性的智能客服系统。 本文将详细讲解如何设计并实现一个基于 Spring AI 的智能客服系统。 1. 系统架构设计 智…

C#字典Dictionary用法详解

本文详解C#字典Dictionary用法 目录 本文详解C#字典Dictionary用法 1定义 2特点 3常用属性 4常用方法 5具体例子 6集合初始化 7自定义类作为值或键 1定义 Dictionary是一个泛型集合,它存储唯一键和值的集合,其中每个键都是唯一且与一个值关联的,能提供快速的基于键…

【数组OJ】两数之和

两数之和 题目 思路 暴力枚举:逐一遍历,将当前数与之后的数个个相加、判断其相加后是否等于target 代码实现 /*** Note: The returned array must be malloced, assume caller calls free().*///暴力枚举: int* twoSum(int* nums, int nu…