指针!!C语言(第二篇)
目录
一. 数组名的理解
二. 一维数组传参的本质
三. 冒泡排序法
四. 二级指针与指针数组
五. 字符指针变量与数组指针
一. 数组名的理解
在我们对指针有了初步的理解之外,今天我们来掌握一些新的知识就是数组与指针,第一个对数组名的了解,我们先来看一段代码:
int main()
{int arr[5] = { 1,2,3,4,5 };int* p = &arr[0];//取出arr数组中第一个元素的地址printf("&arr[0]=%p\n", &arr[0]);return 0;
}
在上面的代码中我们可以看到我们取出了arr数组中的第一个元素的地址,并将其打印出来,而在在之前的知识中我们也提到过,其实数组名就是数组首元素的地址,为了验证这个结论的正确性,我们看下面一张图片:
从图我们可以看出来,&arr[0]和arr的地址是一样的,所以说明数组名的地址就是数组首元素的地址,但是还是有两个例外的,比如说sizeof(arr),计算的并不是首元素的字节,而是整个数组的字节,再比如&数组名,取出的是也整个数组。我们插入一段代码来看看具体的情况:
int main()
{int arr[5] = { 1,2,3,4,5 };int* p1 = &arr[0];int* p2 = arr;int* p3 = &arr;printf("&arr[0] =%p\n", &arr[0]);printf("&arr[0]+1 =%p\n", &arr[0]+1);printf("arr =%p\n", arr);printf("arr+1 =%p\n", arr+1);printf("&arr =%p\n", &arr);printf("&arr+1 =%p\n", &arr+1);return 0;
}
从上面的代码中我们可以更直观的感受arr和&arr的区别,arr+1移动了4个字节,而&arr+1移动了20个字节,也就是移动了一整个数组,这就是arr和&arr最本质的区别。
使用指针打印数组:
在学习上面的知识之后,我们可以试着用指针打印出数组:
int main()
{int arr[5] = { 0 };int sz = sizeof(arr) / sizeof(arr[0]);int* p = &arr[0];for (int i = 0; i < sz; i++){scanf("%d", p+i);}for (int i = 0; i < sz; i++){printf("%d ", *(p + i));}return 0;}
二. 一维数组传参的本质
#include <stdio.h>
void test(int arr[])
{int sz2 = sizeof(arr)/sizeof(arr[0]);printf("sz2 = %d\n", sz2);
}
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};int sz1 = sizeof(arr)/sizeof(arr[0]);printf("sz1 = %d\n", sz1);test(arr);return 0;
}
打印出的如果可能会让我们抓不着头脑,到底是为什么呢?这里也为大家解释一下,数组名是数组首元素的地址;那么在数组传参的时候,传递的是数组名,也就是说本质上数组传参传递的是数组首元素的地址。所以函数形参的部分理论上应该使用指针变量来接收首元素的地址。那么在函数内部我们写 sizeof(arr) 计算的是⼀个地址的大小(单位字节)而不是数组的大小(单位字节)。正是因为函数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的。所以数组在传参的时候也是可以直接出传入指针的。eg:int* arr。
三. 冒泡排序法
学习了上面的知识之后我们来练习一个题目,要求就是在数组中输出一些乱序数字,最终可以升序排列出来。下面给出大家一张图片说明:
代码如下:
void test(int arr[], int sz)//参数接收数组元素个数
{int i = 0;for (i = 0; i < sz - 1; i++){int flag = 1;//假设这⼀趟已经有序了int j = 0;for (j = 0; j < sz - i - 1; j++){if (arr[j] > arr[j + 1]){flag = 0;//发⽣交换就说明,⽆序int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}if (flag == 1)//这⼀趟没交换就说明已经有序,后续⽆序排序了break;}
}int main()
{int arr[10] = { 0 };int sz = sizeof(arr) / sizeof(arr[0]);int* p = arr;for (int i = 0; i < sz; i++){scanf("%d", p + i);}test(arr, sz);for (int i = 0; i < sz; i++){printf("%d ", *(p + i));}return 0;
}
上面的代码详细的展示了整个冒泡排序法的过程,对应了上面的图片解释,另外加上了一个int flag=1;就是说如果我们输入直接是有序的,那就没有没有必要再去排一遍,所以我们在if里面增加一个条件,如果需要发生交换就将flag置为0。如果flag=1,就说明这一趟已经有序了,进行下一趟排序。大家也可以自己动手操作一下。
四. 二级指针与指针数组
二级指针:
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里? 这就是二级指针。

使用指针数组模拟二维数组:
int main()
{int arr1[5] = { 1,2,3,4,5 };int arr2[5] = { 2,3,4,5,6 };int arr3[5] = { 3,4,5,6,7 };int* pa[3] = { arr1,arr2,arr3 };int i = 0;int j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 5; j++){printf("%d ", pa[i][j]);}printf("\n");}
}
五. 字符指针变量与数组指针
我们可以想到指针变量可以是整型的,就会有字符型的,即char*:
int main()
{char ch = 'w';char *pc = &ch;*pc = 'w';return 0;
}
同时也可以:
int main()
{const char* pstr = "hello bit.";printf("%s\n", pstr);return 0;
}
在这个代码中我们可以想想是不是把hello bit完全放入指针pstr中呢?代码 const char* pstr = "hello bit."; 特别容易让同学以为是把字符串 hello bit 放 到字符指针 pstr 里了,但其实本质是把字符串 hello bit. 首字符的地址放到了pstr中。下面我们来练习一道与字符相关的习题:
#include <stdio.h>
int main()
{char str1[] = "hello bit.";char str2[] = "hello bit.";const char *str3 = "hello bit.";const char *str4 = "hello bit.";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");return 0;
}
1

相关文章:

指针!!C语言(第二篇)
目录 一. 数组名的理解 二. 一维数组传参的本质 三. 冒泡排序法 四. 二级指针与指针数组 五. 字符指针变量与数组指针 一. 数组名的理解 在我们对指针有了初步的理解之外,今天我们来掌握一些新的知识就是数组与指针,第一个对数组名的了解ÿ…...

AIGC-ToonCrafter: Generative Cartoon Interpolation
论文:https://arxiv.org/pdf/2405.17933 代码:https://doubiiu.github.io/projects/ToonCrafter 给定首尾帧,生成逼真生动的动画 MOTIVATION Traditional methods which implicitly assume linear motion and the absence of complicated phenomena like disoccl…...
牛奶供应(三)
一个字贪,第一天,只能选择制作方式,后面的每一天,在<今天制作>与<前期存储>之间取更优解 例如样例:100 5,200 5,90 20,存储成本为10 第1天: 一定是制作&…...

首批通过 | 百度通过中国信通院H5端人脸识别安全能力评估工作
2024年5月,中国信息通信研究院人工智能研究所依托中国人工智能产业发展联盟安全治理委员会(AIIA)、“可信人脸应用守护计划”及多家企业代表共同开展《H5端人脸识别线上身份认证安全能力要求及评估方法》的编制工作,并基于该方法开…...

JVM---对象是否存活及被引用的状态
1.如何判断对象是否存活 1.1 引用计数算法 概念:在对象头部增加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 优点࿱…...

科研绘图系列:R语言分割小提琴图(Split-violin)
介绍 分割小提琴图(Split-violin plot)是一种数据可视化工具,它结合了小提琴图(violin plot)和箱线图(box plot)的特点。小提琴图是一种展示数据分布的图形,它通过在箱线图的两侧添加曲线来表示数据的密度分布,曲线的宽度表示数据点的密度。而分割小提琴图则是将小提…...

WEB前端09-前端服务器搭建(Node.js/nvm/npm)
前端服务器的搭建 在本文中,我们将介绍如何安装和配置 nvm(Node Version Manager)以方便切换不同版本的 Node.js,以及如何设置 npm(Node Package Manager)使用国内镜像,并搭建一个简单的前端服…...
ASP.NET Core在启动过程中使用数据库实例的几种方式
ASP.NET Core项目启动过程中若要调用SqlSugarClient实例操作数据库数据(假设操作函数如下),特此记录以下几种方式: public class PublicDataBuffer {public static List<EnvironmentRecord> DataBuffer new List<Envir…...

AndroidStudio 编辑xml布局文件卡死问题解决
之前项目编写的都是正常,升级AndroidStudio后编辑布局文件就卡死,还以为是AndroidStudio文件。 其实不然,我给整个项目增加了版权声明。所以全部跟新后,布局文件也增加了版权声明。估计AndroidStudio在 解析布局文件时候因为有版…...

使用 PVE 自签 CA 证书签发新证书
前言 PVE 安装时会自动创建一个有效期 10 年的 CA 证书, 我们可以利用这个 CA 证书给虚拟机中的 Web 应用签发新的 TLS 证书用于提供 HTTPS 服务. 下面以 PVE 虚拟机中通过 Docker 跑的一个 雷池 应用为例进行演示. PVE 证书位置 官方文档: https://pve.proxmox.com/wiki/Pr…...
ubuntu 22.04安装Eigen
1 安装 git clone https://gitlab.com/libeigen/eigen.gitcd eigen mkdir build cd build cmake ..sudo make install... -- Installing: /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry -- Installing: /usr/local/include/eigen3/unsupported/Eige…...

vue使用audio 音频实现播放与关闭(可用于收到消息给提示音效)
这次项目中因为对接了即时通讯 IM,有个需求就是收到消息需要有个提示音效,所以这里就想到了用HTML5 提供的Audio 标签,用起来也是很方便,首先让产品给你个提示音效,然后你放在项目中,使用Audio 标签&#x…...
STM32 产生Hard Fault 调试方法
STM32 产生hard-fault 调试方法 需求 当STM32 产生Hard Fault的时候我们希望可以打印出一些重要的寄存器信息,然后定位代码出错的地方。 参考 https://github.com/ferenc-nemeth/arm-hard-fault-handler 原理 STM32代码运行的时候一般在是main函数while(1)中循…...

java-selenium 截取界面验证码图片并对图片文本进行识别
参考链接 1、需要下载Tesseract工具并配置环境变量,步骤如下 Tesseract-OCR 下载安装和使用_tesseract-ocr下载-CSDN博客 2、需要在IDEA中导入tess4j 包;在pom.xml文件中输入如下内容 <!--导入Tesseract 用于识别验证码--><dependency>&l…...

【Linux】进程信号 --- 信号产生
👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章对…...
Docker 容器中的 Docker Compose 简介
Docker Compose是什么 Docker Compose是一个用于定义和运行多个Docker容器的工具。它是Docker官方提供的开源项目,用于实现对Docker容器集群的快速编排。通过Compose,开发者可以使用YAML文件(通常是docker-compose.yml文件)来配置…...
手机日历如何与Outlook同步
有很多人和我一样遇到手机日历与Outlook同步问题,如新版outlook与小米日历的同步问题 - Microsoft Community,outlook账号无法在手机端自带的电子邮件App以exchange模式登录 - Microsoft Community,在安卓手机端无法电子邮件App以exchange模式…...

python基础语法 007 文件操作-1读取写入
1 文件操作 1.1 什么时候用文件操作? 打开文档写东西看东西拿文档做统计 在python 文档操作作用 存储数据读取数据 打开文件有什么用? 读取数据,写入数据不管什么数据都可以用open打开,如可复制一张图片 1.2 open() 读取,…...

C语言·函数(超详细系列·全面总结)
前言:Hello大家好😘,我是心跳sy,为了更好地形成一个学习c语言的体系,最近将会更新关于c语言语法基础的知识,今天更新一下函数的知识点,我们一起来看看吧! 目录 一、函数是什么 &a…...

Windows及Linux系统加固
君衍. 一、Windows加固1、配置简介2、账户配置3、本地配置4、安全设置 二、Linux加固1、配置简介2、网络配置3、日志和审计配置4、访问认证和授权配置5、系统运维配置 一、Windows加固 1、配置简介 通常在Windows安全配置中有两类对象 一类是Windows Server,如win …...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
P10909 [蓝桥杯 2024 国 B] 立定跳远
# P10909 [蓝桥杯 2024 国 B] 立定跳远 ## 题目描述 在运动会上,小明从数轴的原点开始向正方向立定跳远。项目设置了 $n$ 个检查点 $a_1, a_2, \cdots , a_n$ 且 $a_i \ge a_{i−1} > 0$。小明必须先后跳跃到每个检查点上且只能跳跃到检查点上。同时࿰…...

【汇编逆向系列】六、函数调用包含多个参数之多个整型-参数压栈顺序,rcx,rdx,r8,r9寄存器
从本章节开始,进入到函数有多个参数的情况,前面几个章节中介绍了整型和浮点型使用了不同的寄存器在进行函数传参,ECX是整型的第一个参数的寄存器,那么多个参数的情况下函数如何传参,下面展开介绍参数为整型时候的几种情…...
el-amap-bezier-curve运用及线弧度设置
文章目录 简介示例线弧度属性主要弧度相关属性其他相关样式属性完整示例链接简介 el-amap-bezier-curve 是 Vue-Amap 组件库中的一个组件,用于在 高德地图 上绘制贝塞尔曲线。 基本用法属性path定义曲线的路径,可以是多个弧线段的组合。stroke-weight线条的宽度。stroke…...
宠物车载安全座椅市场报告:解读行业趋势与投资前景
一、什么是宠物车载安全座椅? 宠物车载安全座椅是一种专为宠物设计的车内固定装置,旨在保障宠物在乘车过程中的安全性与舒适性。它通常由高强度材料制成,具备良好的缓冲性能,并可通过安全带或ISOFIX接口固定于车内。 近年来&…...