c/c++:数组做函数参数,传入函数的首地址,相当于传址,指针做函数返回值,数组止做c语言中函数的返回值

news2024/12/24 2:32:59

c/c++:数组做函数参数,传入函数的首地址,相当于传址,指针做函数返回值,数组禁止做c语言中函数的返回值

2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c++的话,
我所知道的周边的会c++的同学,可手握10多个offer,随心所欲,而找啥算法岗的,基本gg
提示:系列c++学习的基础和高阶知识,用于公司生产实践中,实实在在的公司部署产品要用的,因为c++速度快,
而java和Python速度慢,自然往硬件里面部署算法啥的,都得用c++或者c,因此本科学的c很重要,后来的Python或者java就没有那么重要了,
c/c++系列文章:
【1】c++:c语言优缺点,visual studio2019如何新建项目,写hello world程序
【2】c/c++:gcc安装,gcc编译hello world文件,system函数调用系统命令,sleep函数
【3】linux下gcc的编译过程和功能,预处理,编译,汇编,链接,.c预处理为.i文件.s文件.o文件.exe文件
【4】c/c++:windows平台下依赖的动态库,c底层是汇编语言,程序断点调试,反汇编,vs快捷键
【5】c/c++:数据类型,常量变量,标识符,有符号整型,无符号unsigned,字符类型,字符串类型,实数类型,浮点型,科学计数法
【6】c/c++:2进制、8进制、10进制、16进制和进制之间的转换,c语言输出匹配格式%
【7】c/c++:原码,反码,补码和常见的数据类型取值范围,溢出
【8】c/c++:类型限定符,printf输出格式,putchar,scanf,getchar
【9】c/c++:算术运算符,赋值运算,逻辑运算,比较运算,三目运算,逗号运算,数据类型转换
【10】c/c++:顺序结构,if else分支语句,do while循环语句,switch case break语句
【11】c/c++:for循环语句,分号不可省略,表达式可以省略,猜数字游戏,跳转语句continue,break,避免写goto
【12】c/c++:一维数组,初始化数组,循环打印数组,计算数组存储空间,数组元素个数,数组逆序算法
【13】c/c++:二维数组,数组的行数和列数求法sizeof,数组初始化不同形式,5个学生,3门功课,求学生总成绩和功课总成绩
【14】c/c++:visual studio的代码快捷键,VS设置自定义默认代码,使用快捷键
【15】c/c++:三维数组,字符数组和字符串,统计字符串中字符出现的频次,scanf输入空格,正则匹配表达式
【16】c/c++:gets(),fgets(),puts(),fputs(),strlen(),字符串拼接函数
【17】c/c++:函数的作用,分类,随机数,函数定义,调用,申明,exit()函数,多文件编程,防止头文件重复
【18】c/c++:指针,指针定义和使用,指针大小4字节,野指针,空指针*p=NULL
【19】c/c++:万能指针,泛型指针,const int *p,int const *p,int *const p,const int *const p,指针与数组,p++,
【20】c/c++:指针p+p-p*p/,数组&a+1,指针减指针,指针实现strlen函数,指针的比较运算,指针数组,多级指针
【21】c/c++:栈帧,传值,传址,实参传值给形参,传地址指针给形参


文章目录

  • c/c++:数组做函数参数,传入函数的首地址,相当于传址,指针做函数返回值,数组禁止做c语言中函数的返回值
    • @[TOC](文章目录)
  • c/c++:指针做函数参数,传递有效地址值,非野指针
  • 数组做函数参数,很重要的知识点
  • 指针做函数的返回值
  • 数组做函数的返回值,简单
  • 总结

c/c++:指针做函数参数,传递有效地址值,非野指针

这个上一节我们说过了
简单
就是传地址而已

数组做函数参数,很重要的知识点

冒泡排序那个事情
咱们来说一把

咱们直接传递数组看看?

本来数组就是一个指针地址,所以传进去之后,它针对数组本身实参直接排序了
确实是这样的


void printArr3(int arr[], int n);//申明

void bubble_sort2(int arr[], int n)
{
    if (sizeof(arr) == 0) return;
    //冒泡排序
    //int n = sizeof(arr) / sizeof(arr[0]);
    for (int i = n - 1; i >= 0; i--)
    {
        for (int j = i; j < n - 1; j++)//每次都是右边i--n-1对比一把,大的冒泡
        {
            if (arr[j] > arr[j + 1]) swap2(arr, j, j + 1);//交换
        }//知道i=0,整体比一遍
    }

    printf("函数内部");
    printArr3(arr, n);
}


void printArr3(int arr[], int n)
{
    //整体打印一个数组
    if (sizeof(arr) == 0) return;
    //冒泡排序
    //int n = sizeof(arr) / sizeof(arr[0]);
    for (size_t i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

void f78(void)
{
    int arr[] = { 4,1,3,2 };
    int n = sizeof(arr) / sizeof(arr[0]);
    printArr3(arr, n);

    bubble_sort2(arr, n);//直接传入数组

    printArr3(arr, n);
}


int main(void)
{
    f78();

    system("pause");
    return 0;
}

在这里插入图片描述
这跟java和c++一模一样

因为他们都是建立在c之上的

但是注意,你能否在数组内部求其长度???
不能
我之前就炸锅


void bubble_sort2(int arr[], int n)
{
    if (sizeof(arr) == 0) return;
    //冒泡排序
    int k = sizeof(arr) / sizeof(arr[0]);
    printf("%d\n", k);//看看n
    for (int i = n - 1; i >= 0; i--)
    {
        for (int j = i; j < n - 1; j++)//每次都是右边i--n-1对比一把,大的冒泡
        {
            if (arr[j] > arr[j + 1]) swap2(arr, j, j + 1);//交换
        }//知道i=0,整体比一遍
    }

    printf("函数内部");
    printArr3(arr, n);
}

在这里插入图片描述
为啥呢,因为冒泡排序函数,它是一个栈帧,与main不同
里面申请了一个数组变量
但是数组本质就是一个指针,指针只放一个地址
所以就是4字节的地址,仅此而已
你求arr的size就是4字节
求arr[0]的size也就4字节
仅此而已
故k=1


void bubble_sort2(int arr[], int n)
{
    if (sizeof(arr) == 0) return;
    //冒泡排序
    int k = sizeof(arr) / sizeof(arr[0]);
    printf("%d\n", k);//看看n
    printf("%p\n", &arr);//看看n
    printf("%p\n", &arr[0]);//看看n

    printf("%d\n", *arr);//看看n
    printf("%d\n", arr[0]);//看看n
    for (int i = n - 1; i >= 0; i--)
    {
        for (int j = i; j < n - 1; j++)//每次都是右边i--n-1对比一把,大的冒泡
        {
            if (arr[j] > arr[j + 1]) swap2(arr, j, j + 1);//交换
        }//知道i=0,整体比一遍
    }

    printf("函数内部");
    printArr3(arr, n);
}

在这里插入图片描述

冒泡函数中arr的地址,是冒泡函数的栈帧中的临时空间,它里面存的是main函数的arr[0]的地址
arr[0]的地址,是main函数的栈帧中的临时空间

也就是说,函数做形参,实际上是传入了地址,地址即指针


void bubble_sort3(int* arr, int n)
{
    if (sizeof(arr) == 0) return;
    //冒泡排序
    int k = sizeof(arr) / sizeof(arr[0]);
    printf("%d\n", k);//看看n
    printf("%p\n", &arr);//看看n
    printf("%p\n", &arr[0]);//看看n

    printf("%p\n", arr);//看看n
    printf("%d\n", arr[0]);//看看n
    for (int i = n - 1; i >= 0; i--)
    {
        for (int j = i; j < n - 1; j++)//每次都是右边i--n-1对比一把,大的冒泡
        {
            if (arr[j] > arr[j + 1]) swap2(arr, j, j + 1);//交换
        }//知道i=0,整体比一遍
    }

    printf("函数内部");
    printArr3(arr, n);
}

在这里插入图片描述

所以
下面俩都等价的
void bubble_sort3(int* arr, int n)==void bubble_sort3(int arr[], int n)
懂了吗
数组做形参,相当于指针做形参

屌爆了

我们来看看它们的栈帧的分配过程

所以要把函数真的长度,重新搞一个参数放进去,我为啥要定义其长度n知道了吧
后来java改了这个骚操作,因为太麻烦了。

在这里插入图片描述
当年大一压根没有学会这些东西
稀里糊涂
时隔这多年,为了工作所需,又重新学一遍c,真的美滋滋

a[i]=*(a+i)
所以只要首地址进去就行,
自然访问数组就很方便了

指针做函数的返回值

int* f()

返回一个地址,估计很数组有挂钩


int m = 100;//全局变量

int* xingf(int a, int b)
{
    return &m;//地址呗
    //结束返回指针
}

void f79(void)
{
    int* p=NULL;
    p = xingf(10, 20);//返回p
    printf("全局变量m的地址%p\n", &m);//本身
    printf("返回来指针的地址:%p\n", p);//本身
    printf("%d\n", *p);//里面存的东西
}

int main(void)
{
    f79();

    system("pause");
    return 0;
}

在这里插入图片描述
全局变量是整个程序结束之后才会gg的

m地址,是你f返回的指针
对不对
解引用就是100

所以指针作为函数的返回值,好说

只要是返回地址,咱们解引用操作的就是地址


int m = 100;//全局变量

int* xingf(int a, int b)
{
    int n = 1234;
    return &n;//地址呗
    //结束返回指针
}

void f79(void)
{
    int* p=NULL;
    p = xingf(10, 20);//返回p
    printf("全局变量m的地址%p\n", &m);//本身
    printf("返回来指针的地址:%p\n", p);//本身
    printf("%d\n", *p);//里面存的东西
}

int main(void)
{
    f79();

    system("pause");
    return 0;
}

在这里插入图片描述
要注意哦
你局部斌量,在调用完后,栈帧就会gg
你的&n压根就是野指针,没意义
返回一个随机地址
得到的数27不再是1234
这点要清楚?
在这里插入图片描述

所以说,指针作为返回值,不能返回函数内部的局部变量的地址值,懂吧?
在这里插入图片描述

数组做函数的返回值,简单

禁止!!!
你只能写指针做返回值
数组本身就是指针
哈哈哈哈

懂?


总结

提示:重要经验:

1)
2)学好c++,即使经济寒冬,手握10个大厂offer绝对不是问题!
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

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

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

相关文章

Python小姿势 - Python基础知识

Python基础知识 Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。 Python的创始人为吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;&#xff0c;于1989年底发布第一个公开发行版本——0.9.0。 自2004年以来&#xff0c;Python已经成为顶级开源项目&…

从浏览器地址栏输入 url 到显示主页的过程?

当在浏览器地址栏输入一个URL并按下回车键后&#xff0c;发生了一系列复杂的过程&#xff1a; DNS解析&#xff1a;浏览器会对输入的URL进行DNS解析&#xff0c;将域名转换为服务器的IP地址。这一过程包括浏览器缓存、操作系统缓存、本地HOST文件配置、本地DNS服务器以及远程DN…

多通道振弦传感器无线采集仪 数据发送详解

多通道振弦传感器无线采集仪 数据发送过程 每次采集仪启动后会将采集到的传感器数据进行内部存储&#xff0c;并在设置好的时间间隔将数据发送出去&#xff0c;通过修改“数据发送方式”参数&#xff0c;监测数据可由数据接口输出也可经由无线网络发送。 在发送监测数据时&…

SpringCloud --- Nacos注册中心、配置管理

一、Nacos注册中心 1.1、认识和安装Nacos Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c;在国内受欢迎程度较高。 1.2、服务注册到nacos Nacos是SpringCloudAlibaba的组件&#xff0c;而SpringCloudAlibaba也遵循Spr…

3dtiles之点云pnts文件详解

3DTiles是一种用于在WebGL环境中渲染大规模三维地理数据的规范&#xff0c;它允许开发者将复杂的三维数据以高效的方式传输、存储和呈现。而PNTS格式则是3DTiles规范中用于存储点云数据的格式之一。在本文中&#xff0c;我们将探讨3DTiles和PNTS的基本原理以及它们如何用于处理…

集成学习(Ensembles)

Ensembles 前言EnsemblesAveraging,StackingWhy does averaging work?如何理解&#xff1a;In practice errors won’t be completely independent due to noise in the labels Random ForestsDoes averaging work if you use trees with the same parameters?Bootstrap Samp…

【AgentGPT】网页版的 Auto-GPT,让 AI 成为我们的生产力工具

在上一篇文章笔者分享了 Auto-GPT 的安装&使用,不过因为操作相对繁琐,可能会导致许多想使用工具的人卡在环境的设定上。 所以这边再介绍另一款无需安装,可直接使用的工具“AgentGPT”;他的操作超级简单,只要设定好目标(Goal),一键发送即可! 大纲 ▋ 如何免费使用 A…

【C++】计算类的大小

目录 简介计算类的大小场景1&#xff1a;空类场景2场景3&#xff1a;含有虚函数场景4&#xff1a;继承场景5&#xff1a;存在字节对齐的情况 总结结语 简介 Hello&#xff01; 非常感谢您阅读海轰的文章&#xff0c;倘若文中有错误的地方&#xff0c;欢迎您指出&#xff5e; …

Linux多媒体子系统02:V4L2核心框架分析(部分)

目录 1 V4L2框架结构概述 1.1 imx8视频输入通路硬件结构 1.2 V4L2设备节点观察 1.3 dts配置观察 1.4 probe函数观察 1.4.1 函数功能简介 1.4.2 各模块probe函数分析 1.5 V4L2框架结构图示 2 设备管理机制 2.1 v4l2_device结构体相关 2.1.1 v4l2_device结构体 2.1.2…

15.Java多线程

目录 1. Java基本介绍 2. JDK下载安装及其环境配置 3. 一个简单的java程序 4. Eclipse基本使用、数据类型、运算符 5. 控制语句&#xff08;if、switch、for、while、foreach&#xff09; 6. Java数组 7. Java字符串对象(String|StringBuffer|StringBuilder|StringJoiner…

教你如何免费使用ChatGPT 4?(国内可以直接访问,不用魔法)

目录 一. 内容介绍 二. 功能介绍 三. 优势 四. 版本比较 五. 国内试用方法 内容介绍&#xff1a; ChatGPT 4是由OpenAI开发的最新一代大型语言模型&#xff0c;其采用了GPT-3.5的技术架构&#xff0c;是目前全球最强大的通用AI模型之一。ChatGPT 4拥有极高的语言处理能力和…

SD卡恢复怎么做?内存卡数据恢复,3个方法!

案例&#xff1a;sd卡怎么恢复&#xff1f; 【我的sd卡用了快一年了&#xff0c;里面存储了很多非常重要的文件&#xff0c;但不知道为什么我今天将它插入电脑后&#xff0c;很多文件都无法显示了&#xff0c;大家有什么好的方法可以恢复sd卡吗&#xff1f;感谢回答&#xff0…

【翻译一下官方文档】之uniapp的导航条设置

目录 uni.setNavigationBarTitle(OBJECT) uni.setNavigationBarColor(OBJECT) uni.hideHomeButton(OBJECT) uni.setNavigationBarTitle(OBJECT) 动态设置当前页面的标题。 OBJECT参数说明 参数类型必填说明titleString是页面标题successFunction否接口调用成功的回调函数fai…

安虚拟机详细教程 VMware虚拟机与主机之间不能复制粘贴及拖拽问题

VMware虚拟机中安装Ubuntu18.04&#xff08;linux发行版&#xff09;【超详细图文教程】_vmware安装ubuntu18.04__7270的博客-CSDN博客 1. 查看vmware Tools是否安装 打开虚拟机 &#xff0c;点击上方导航栏 ‘虚拟机’ 查看VMware Tools是否安装&#xff0c;如果未安装&#…

Linux和shell命令第一节课

windows开发 linux服务 区块链&#xff0c; 稳定&#xff0c;安全&#xff0c;可移植性&#xff0c;低资源消耗&#xff0c;开源软件---windows付费 linux就是操作系统&#xff0c;网络服务&#xff0c;移动设备&#xff0c;嵌入式系统&#xff0c;计算器服务器 除个人桌面…

Sentinel:服务限流

文章目录 创建工程测试工程流控熔断热点授权规则系统规则SentinelResource 配置持久化执行流程 创建工程测试工程 1.导入依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><v…

开放原子训练营第三期:RT-Thread 学习有感

介绍 前几天有幸收到C站的训练营学习邀请&#xff0c;了解到这两天即将举行的开放原子 RTT 训练营。博主算是一名嵌入式方向的小白&#xff0c;主要还是在裸机上进行开发&#xff0c;但对嵌入式的操作系统和实时系统很感兴趣。在这次学习训练营中借助一些学习示例&#xff0c;…

【Linux】 1.2基本指令-part 2

文章目录 07. man指令08.cp指令(copy)&#xff08;重要&#xff09;09.mv指令(move)&#xff08;重要&#xff09;10.cat指令- 补充&#xff1a;echo 与 >11.more指令12.less指令&#xff08;重要&#xff09;13.head指令14.tail指令- 补充&#xff1a;管道 07. man指令 ma…

CV不存在了?体验用Segment Anything Meta分割清明上河图

目录 1 Facebook抠图神器2 本地版SAM配置3 Web版SAM体验4 总结 1 Facebook抠图神器 在图像处理与计算机视觉领域&#xff0c;图像分割(image segmentation)是在像素级别将一个完整图像划分为若干具有特定语义区域(region)或对象(object)的过程。每个分割区域是一系列拥有相似特…

IJKPLAYER源码分析-常用API

前言 本文简要介绍IJKPLAYER的几个常用API&#xff0c;以API使用的角度&#xff0c;来审视其内部运作原理。这里以iOS端直播API调用切入。 调用流程 init 创建播放器实例后&#xff0c;会先调用init方法进行初始化&#xff1a; - (IJKFFMediaPlayer *)init {self [super ini…