深入理解指针(五)

news2024/11/26 13:32:58

一、一维数组传参的本质

首先从一个问题开始,我们之前都是在函数外部计算数组的元素个数,那我们可以把数组传给一个函数后,在函数内部求数组的元素个数吗?

我们来看一下下面的代码:

#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)计算的是一个地址的大小(单位字节)而不是数组的大小(单位字节)。正是因为函数的参数部分的本质是指针,所以在函数内部是没办法求1数组的元素个数的。

#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;
}

如果我们写成test(int*arr)结果也是一样的。

总结·:一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

二、冒泡排序

核心思想:亮亮相邻元素进行比较。

这部分我们看代码用笔画出来就能理解了。

这是最基础的代码:

#include<stdio.h>
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
    int i = 0;
    for (i = 0; i < sz - 1; i++)
    {
        int j = 0;
        for (j = 0; j < sz - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j + 1] = tmp;
            }
        }
    }
}
int main()
{
    int arr[] = { 3,6,2,7,9,1,10,4,5,8,10 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz);
    int i = 0;
    for (i = 0; i < sz - 1; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

如果后面都是有序的,但我们还是要一遍一遍的比较,有点太浪费时间了,于是我们可以优化一下代码,当后面都是有序时,我们便直接结束遍历,这样的话更省时间。

优化版:

#include<stdio.h>
void bubble_sort(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[] = { 3,6,2,7,9,1,10,4,5,8,10 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz);
    int i = 0;
    for (i = 0; i < sz - 1; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

三、二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?

这时就有了二级指针

对于二级指针的运算有:

*ppa通过对ppa中的地址进行解引用,这样找到的是pa,*ppa其实访问的就是pa。

int b = 6;
*ppa = &b;//等价于pa=&b;

**ppa先通过*ppa找到pa,然后对pa进行解引用操作;*pa找到的是a

** ppa = 30;
//等价于*pa=30
//等价于a=30

四、指针数组

指针数组是指针还是数组?

我们类比一下,整型数组是存放整型的数组,字符数组是存放字符的数组。

那指针数组就是存放指针的数组喽。

五、指针数组模拟二维数组

#include<stdio.h>
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[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型一维数组,parr[i][j]就是整型一维数组中的元素。

上述代码模拟出二维数组的效果,实际上不完全是二维数组,因为每一行并非是连续的。

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

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

相关文章

springboot+JTA+atomikos多数据源分布式事务管理

一、项目需求 1、同时操作两个数据库&#xff0c;一个在本地服务器&#xff0c;一个在云服务器。 2、数据库数据是同步的&#xff0c;两个数据库同时做update、insert等操作时&#xff0c;无论哪个数据库操作失败&#xff0c;要求两个数据库数据同时回滚。 3、两个数据库均为SQ…

整理 酷炫 Flutter 优质 布局、交互 开源App

xtimer-flutter-app Flutter 计时器应用 项目地址&#xff1a;https://github.com/pedromassango/xtimer-flutter-app 项目Demo&#xff1a;https://download.csdn.net/download/qq_36040764/89631382

<数据集>骑行头盔识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;5026张 标注数量(xml文件个数)&#xff1a;5026 标注数量(txt文件个数)&#xff1a;5026 标注类别数&#xff1a;3 标注类别名称&#xff1a;[helmet, without_helmet, two_wheeler] 序号类别名称图片数框数1helm…

CCleaner Pro v6.26.11169 中文绿色便携版免安装 下载 Windows缓存清理 磁盘清理 注册表清理 大文件查找

可以清理系统和软件缓存&#xff0c;清理注册表&#xff0c;磁盘分析进行大文件查找 下载地址(资源制作整理不易&#xff0c;下载使用需付费&#xff0c;不能接受请勿浪费时间下载) 链接&#xff1a;https://pan.baidu.com/s/1XLi-J1h-G5xx8QBwXeFMcg?pwd2fen 提取码&#xf…

美股涨跌互现,半导体与科技股受关注

美股市场表现 昨夜&#xff0c;美股三大股指表现不一。道琼斯工业平均指数下跌0.36%&#xff0c;纳斯达克综合指数上涨0.21%&#xff0c;标准普尔500指数持平。科技股表现突出&#xff0c;其中英伟达股价上涨超过4%。债市方面&#xff0c;美国十年期国债收益率下跌至3.905%&am…

大语言模型(LLM)的SIO解构

引言: 大语言模型&#xff08;LLM&#xff09;作为现代人工智能领域的重要突破&#xff0c;已经在自然语言处理&#xff08;NLP&#xff09;中展现出了卓越的能力。这些模型通过深度学习算法和大规模数据训练&#xff0c;在多个语言任务中表现出接近人类的理解与生成能力&#…

七、2 ADC数模转换器有关函数介绍(Keil5)

函数介绍 &#xff08;1&#xff09;ADCCLK的配置函数&#xff08;在rcc.h中&#xff09; &#xff08;2&#xff09;ADC的库函数&#xff08;在adc.h中&#xff09;

将 Amazon SageMaker 机器学习模型与 QuickSight 集成。

增强使用 Amazon SageMaker 和 QuickSight 构建的机器学习模型的概述。 您是否曾想过如何以更简单的方式将 ML 预测添加到您的 BI 平台并分享给业务客户&#xff1f;别担心&#xff01;AWS ML Insights 的 SageMaker 增强型 QuickSight 之一可以满足您的需求&#xff01; 假设…

vue3 antdv3 Select 每行数据的最右侧增加一个x删除按钮,鼠标移上去显示,移走消失,并且点击可以删除当前行的数据。

1、先上个图&#xff0c;这个是实现的效果&#xff1a; 鼠标移动E所在的行&#xff0c;则E的最右侧显示一个x删除按钮&#xff0c;点击x按钮&#xff0c;可以删除当前的数据&#xff0c; 点击增加按钮&#xff0c;可以新增。 2、实现的代码&#xff1a; <Selectv-model:v…

栈与队列 - 用队列实现栈

225. 用队列实现栈 方法一&#xff1a;使用两个队列实现 var MyStack function() {this.queue1 [];this.queue2 []; };/** * param {number} x* return {void}*/ MyStack.prototype.push function(x) {this.queue1.push(x); };/*** return {number}*/ MyStack.prototype.p…

.net实战(VB):连接网页数据

先上效果图 在上程序 Public Sub SendPostRequest(aa As String)MessageBox.Show(sheet.Name)Dim token As StringDim xmlhttp As ObjectDim xmlhttp1 As ObjectDim url As StringDim jsonParams As StringDim response As Stringxmlhttp CreateObject("MSXML2.XMLHTTP&…

【Qt开发】多线程QThread(通过QObject::moveToThread)和QMutex互斥锁的配置和基本函数

【Qt开发】多线程QThread&#xff08;通过QObject::moveToThread&#xff09;和QMutex互斥锁的配置和基本函数 多线程 Qt官方给了两种方法连运行多线程函数 一种是直接用QThread的run()方法 还有一种就是继承QObject 用moveToThread方法去放到QThread里执行 在官方文档中 推…

6.MySQL的增删改查

目录 Create 单行插入数据 全列插入 多行数据指定列插入 插入否则更新 主键冲突 唯一键冲突 &#xff08;☆&#xff09; 替换数据 Retrieve Select列 全列查询 指定列查询 查询字段为表达式 where条件 NULL 的查询 NULL 和 NULL 的比较&#xff0c; 和 <>…

野蛮生长后,AI大模型还需要重复“造轮子”?

AI大模型带来的智能革命&#xff0c;媲美工业革命和电力革命&#xff0c;深刻改变人类社会的生产生活方式&#xff0c;是开启智能时代的那一台“蒸汽机”。 从文生文到文生图&#xff0c;再到文生视频&#xff0c;以ChatGPT、Sora等为代表的大模型引领了全球人工智能技术与产业…

《使用深度学习三分类模型预测胸部CT中的肺腺癌侵袭性》| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统

Title 题目 Predicting Invasiveness of Lung Adenocarcinoma at Chest CT with Deep Learning Ternary Classification Models 《使用深度学习三分类模型预测胸部CT中的肺腺癌侵袭性》 Background 背景 Preoperative discrimination of preinvasive, minimally invasive,…

开关电源之结构分析

如有技术问题及技术需求请加作者微信! 开关电源之结构分析 1、开关电源的结构 常用开关电源,主要是为电子设备提供直流电源供电。电子设备所需要的直流电压,范围一般都在几伏到十几伏,而交流市电电源供给的电压为220V(110V),频率为50Hz(60Hz)。开关电源的作用就是把一…

Surface Studio 曾经耀眼的骚气光芒至今依然

Surface Studio 曾经耀眼的骚气光芒至今依然 Surface Studio当时上市价格25988RMB&#xff0c;现在小黄鱼大概在3000的样子可以买到屏幕没有老化的那种。看着那块巨大的5K触摸屏&#xff0c;简直让人垂涎三尺欲罢不能。 一、卓越配置&#xff0c;尽显强大性能 Surface Studio…

freeRTOS之任务调度

本节课的内容是重中之重&#xff0c;对复习操作系统的任务调度也很有帮助。

API接口自定义字段返回,最终解决方案,再也不用写 vo、dto 转换逻辑了

西湖的晚霞真美啊 前言 此套方案太过完美&#xff0c;唯一缺点就是&#xff0c;字段返回基于反射操作&#xff0c;损失一点点性能 效果 API接口指定使用自定义增强注解MoreSerializeField&#xff0c;标注只返回 departName 字段 前端只会接收到 departName 字段 实现原理 …

Python爬虫——Selenium方法爬取LOL页面

文章目录 Selenium介绍用Selenium方法爬取LOL每个英雄的图片及名字 Selenium介绍 Selenium 是一个用于自动化Web应用程序测试的工具&#xff0c;但它同样可以被用来进行网页数据的抓取&#xff08;爬虫&#xff09;。Selenium 通过模拟用户在浏览器中的操作&#xff08;如点击…