指针!!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 …...
C++ 内存分配器工作原理
C内存分配器工作原理探秘 在C中,动态内存管理是程序性能优化的关键环节,而内存分配器则是幕后英雄。它负责在堆上高效分配和释放内存,直接影响程序的运行效率和资源利用率。无论是标准库中的std::allocator,还是自定义的高性能分…...
鸣潮帧率优化指南:用WaveTools工具箱实现高流畅度游戏体验
鸣潮帧率优化指南:用WaveTools工具箱实现高流畅度游戏体验 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 还在为鸣潮游戏中的画面卡顿、帧率不稳定而困扰吗?想要在激烈的战斗中获得…...
零基础玩转VideoFusion:高效视频批量处理全攻略
零基础玩转VideoFusion:高效视频批量处理全攻略 【免费下载链接】VideoFusion 一站式短视频拼接软件 无依赖,点击即用,自动去黑边,自动帧同步,自动调整分辨率,批量变更视频为横屏/竖屏 项目地址: https://gitcode.com/gh_mirrors/vi/VideoFusion 在数字内容创…...
CTFHub—Web题目解题合集1(超详细)
目录一. HTTP协议(web前置技能)1. 请求方式题解小知识2. 302跳转3. Cookie题目解法二. 信息泄露2.1 备份文件下载1. 网站源码2. bak文件题目题解小知识3. vim缓存题目小知识题解4. DS_Store题目小知识题解2.2 Git泄露1. Log题目小知识(GitHack与dirsearc…...
AR.js实战指南:如何在Web浏览器中构建高效增强现实应用
AR.js实战指南:如何在Web浏览器中构建高效增强现实应用 【免费下载链接】AR.js Image tracking, Location Based AR, Marker tracking. All on the Web. 项目地址: https://gitcode.com/gh_mirrors/arj/AR.js 在移动设备普及的今天,增强现实&…...
IntelliJ IDEA终极教程:从零基础到高效开发的完整指南
IntelliJ IDEA终极教程:从零基础到高效开发的完整指南 【免费下载链接】IntelliJ-IDEA-Tutorial IntelliJ IDEA 简体中文专题教程 项目地址: https://gitcode.com/gh_mirrors/in/IntelliJ-IDEA-Tutorial IntelliJ IDEA 是目前所有 IDE 中最具备沉浸式的 JVM …...
Python内存泄漏分析实战指南(生产环境零停机排查全流程)
第一章:Python内存泄漏的本质与危害Python内存泄漏并非源于C语言中常见的“未释放malloc内存”,而是指对象被意外长期持有,导致垃圾回收器(GC)无法将其回收,从而持续占用堆内存。其本质是**引用关系的非预期…...
macOS Unlocker V3.0:在Windows和Linux上免费运行macOS虚拟机的终极解决方案 [特殊字符]
macOS Unlocker V3.0:在Windows和Linux上免费运行macOS虚拟机的终极解决方案 🚀 【免费下载链接】unlocker 项目地址: https://gitcode.com/gh_mirrors/unlo/unlocker macOS Unlocker V3.0是一款革命性的开源工具,让您能够在Windows或…...
Tailscale打洞失败太慢?手把手教你用Docker部署derper自建中转,告别国际绕行
Tailscale网络优化实战:用Docker自建derper中转节点提升连接速度 Tailscale作为现代零配置组网工具,其基于WireGuard协议的P2P直连特性确实令人惊艳——直到你发现两台设备之间的打洞成功率只有60%,而剩余40%的流量不得不绕行官方位于海外的中…...
实战指南:如何用Hydra在Kali Linux上快速破解Telnet弱密码(附字典优化技巧)
Kali Linux渗透测试实战:Hydra高效破解Telnet服务的进阶技巧 在渗透测试和网络安全评估中,弱密码检测是基础但至关重要的环节。Telnet作为传统的远程管理协议,由于采用明文传输,成为安全测试的重点对象。本文将深入探讨如何利用Ka…...
