C++ Primer Plus第七章 函数——C++的编程模块

python调用海康工业相机并用opencv显示(整体实现) python语言调用海康机器人(hikrobotics)工业相机 第一章 Python 语言下连接海康工业相机,并获取数据 文章目录 系列文章目录 前言 目录 python语言调用海康机器人(hikrobotics)工业相机 文章目录 前言 一、底层接口的准备 二、使用步骤 1.引入库 2.枚举设备 3.判断设备类型 4.输入连接设备 5.创建相机实例并创建句柄 6.打开设备 7.获取相关参数 8.主动获取图像 9.开启取流并获取每张. 阅读详情

        

目录

1、C++函数的定义与声明

 函数声明:

函数定义:

2、函数与数组

        啊哈哈哈,本打工人先大跨一下,因为确实前面六章对于熟悉过C语言的同学来讲属于基础内容,作者准备从第七章先继续阅读总结,但是前六章我一定会回过头回去定时续更,确实是目前时间紧,工作日还是要打工的嘛,像读者们保证~~

1、C++函数的定义与声明

 函数声明:

        就是告诉编译器函数的名称、返回类型以及参数的类型和数量。它不包含函数体,即不包含实际执行的代码。函数声明通常在头文件(.h 或 .hpp 文件)中进行。

        说白话,其实就是告诉编译器,小哥要写函数了,他是什么类型的,会用到一些什么样子的参数、返回值等。但是小哥有点忙,回头再给他准确定义,而编译器你只要知道我后面会写就够了,写好了你在拿去用。

函数定义:

        函数定义包括函数的声明和函数体。函数体是函数执行的代码,它实现了函数声明中描述的功能。其实就是你希望上面声明的函数到底里面怎么搞,就好比你说你要做番茄鸡蛋,你在这里告诉计算机我的鸡蛋怎么炒,番茄什么时候炒,放多少调味料。也就是程序要在这里给他实现了。

2、函数指针与数组

        数组是一种基本的数据结构,用于存储固定大小的相同类型的元素集合。都吃过超市里趣某多的曲奇饼干吧,里面放饼干的塑料壳子,就可以理解为数组。你可以把饼干按顺序的放入开辟好的数组里,同时,你可以可以选择按顺序吃饼干,也可以指定位置直接吃饼干。

定义数组

        数组可以通过指定元素类型和数组大小来定义。以下是举例的一些简单示例,后面有时间的话,我会把数组的用法也续更在这里,但是现在是时间紧迫哈,暂时就不细更了,我只能先插眼,等我兄弟们!

int numbers[10];//定义数组
int numbers[5] = {1, 2, 3, 4, 5};//初始化数组
int firstElement = numbers[0]; // 访问第一个元素
int lastElement = numbers[4];  // 访问最后一个元素
int arraySize = sizeof(numbers) / sizeof(numbers[0]);
int matrix[3][2] = {   //多维数组
    {1, 2},
    {3, 4},
    {5, 6}};
int* dynamicArray = new int[10];//动态数组
const int constantNumbers[5] = {1, 2, 3, 4, 5};//常量数组

函数指针

        谈到数组,那肯定离不开指针。还记着我当时刚入门C的时候被指针硬控的日子,直接回想起来快流泪了。不过指针还是核心的,一定要好好理解透彻。

        先上定义,函数指针是一种特殊的指针,它指向一个函数。函数指针可以用来存储函数的地址,从而可以在运行时调用不同的函数。这对于实现回调函数、事件处理系统、策略模式等高级编程技术非常有用。

        好了,定义上完了,我要说白话了,咱们就拿数组举例吧。在大多数情况下,C++和C语言一样,也将数组名视为指针,C++将数组名解释为其第一个元素的地址。举个例子:

#include <iostream>

int main() {
    int numbers[5] = {10, 20, 30, 40, 50}; // 定义一个整型数组
    int *ptr = numbers; // 定义一个整型指针并指向数组的第一个元素

    // 使用指针遍历数组
    for (int i = 0; i < 5; i++) {
        std::cout << "Element at index " << i << " is: " << *(ptr + i) << std::endl;
    }

    // 也可以直接使用指针进行访问
    for (int i = 0; i < 5; i++) {
        std::cout << "Element at index " << i << " is: " << ptr[i] << std::endl;
    }

    // 使用指针进行数组元素的修改
    for (int i = 0; i < 5; i++) {
        *(ptr + i) = *(ptr + i) * 2; // 将数组中的每个元素乘以2
    }

    // 打印修改后的数组
    for (int i = 0; i < 5; i++) {
        std::cout << "Modified element at index " << i << " is: " << *(ptr + i) << std::endl;
    }

    return 0;
}

       通过上述的案例,大家简单有点感觉了嘛?我记着我之前看过一本书,作者把指针和数组比喻成家与门牌号之间的关系。比如家就是数组,你的家里的房间就是里面的容量,比如home[4],这就是你的四室一家,我给里面每个房间标上门牌号0,1,2,3,这就是home[0],home[1],home[2],home[3]。

        然后我觉着直接喊0,1,2,3太无聊了,我整了个Ikun的门贴,贴在哪个房间就从哪个房间开始做卫生,那我就从0号房间开始贴吧,我给起名叫int *ikun=home,这个ikun就是指针,指向房间0。如果我后面想指向2号房,我就只需要给他+2移过去就可以。

下面咱们来区分两个容易混淆的问题:

  1. 常量指针:这是一个可以改变指向的指针,但它指向的值是常量,不能通过这个指针修改其指向的值。换句话说,指针本身可以指向不同的地址,但是一旦指向了一个地址,就不能通过这个指针来修改指向的值。

  2. 指针常量:这是一个指针,它的指向是固定的,不能改变指向,但它指向的值是可以修改的。换句话说,一旦指针被初始化后,就不能指向其他地址,但是可以通过这个指针来修改它指向的值。

    #include <iostream>
    
    int main() {
        int var = 10;
        const int *ptr = &var; // 常量指针,指向var
    
        std::cout << "Value of var: " << *ptr << std::endl; // 允许
        // *ptr = 20; // 不允许,不能通过常量指针修改指向的值
    
        // ptr = &var + 1; // 允许,可以改变指针的指向
        return 0;
    }
    
    
    
    
    #include <iostream>
    
    int main() {
        int var1 = 10;
        int var2 = 20;
        int *const ptrConst = &var1; // 指针常量,指向var1
    
        std::cout << "Value of var1: " << *ptrConst << std::endl; // 允许
        *ptrConst = 30; // 允许,可以通过指针常量修改指向的值
    
        // ptrConst = &var2; // 不允许,不能改变指针常量的指向
        return 0;
    }

 多维数组

        多维数组是数组的数组,就像我们生活中的矩阵一样,可以有多个维度。在C++中,最常见的多维数组是二维数组,它类似于一个表格,有行和列。

#include <iostream>

int main() {
    // 定义一个5行3列的二维数组并初始化
    int table[5][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9},
        {10, 11, 12},
        {13, 14, 15}
    };

    // 访问并打印二维数组的元素
    for (int i = 0; i < 5; i++) { // 行循环
        for (int j = 0; j < 3; j++) { // 列循环
            std::cout << table[i][j] << " ";
        }
        std::cout << std::endl; // 每打印完一行换行
    }

    return 0;
}
注意事项
  • 多维数组的存储方式是按行优先的,即数组元素在内存中是按行依次存储的。
  • 多维数组的维数过高会增加复杂性,通常不建议使用超过三维的数组。
  • C++标准库提供了std::vector来替代数组,如果需要动态大小的多维数组,可以考虑使用嵌套std::vector。

在C++中,结构体(struct)是一种用户自定义的数据类型,可以包含多个不同类型的成员。结构体可以通过值传递和地址传递两种方式传递给函数。

传递结构体

通过值传递:这种方式会将结构体的所有数据复制到函数内部,因此对结构体的修改不会影响原始数据。

通过地址传递:这种方式传递的是结构体的地址,函数内部通过指针来修改结构体的内容,因此对结构体的修改会影响原始数据。

#include <iostream>

// 定义一个结构体
struct Person {
    std::string name;
    int age;
};

//通过值传递
void modifyByValue(Person p) {
    p.age = 30; // 修改结构体的age成员
    std::cout << "Inside modifyByValue: " << p.name << " is now " << p.age << " years old." << std::endl;
}

int main() {
    Person person = {"John", 25};
    std::cout << "Before modifyByValue: " << person.name << " is " << person.age << " years old." << std::endl;
    modifyByValue(person);
    std::cout << "After modifyByValue: " << person.name << " is " << person.age << " years old." << std::endl;
    return 0;
}

//通过地址传递
void modifyByAddress(Person *p) {
    p->age = 30; // 修改结构体的age成员
    std::cout << "Inside modifyByAddress: " << p->name << " is now " << p->age << " years old." << std::endl;
}

int main() {
    Person person = {"John", 25};
    std::cout << "Before modifyByAddress: " << person.name << " is " << person.age << " years old." << std::endl;
    modifyByAddress(&person);
    std::cout << "After modifyByAddress: " << person.name << " is " << person.age << " years old." << std::endl;
    return 0;
}

        通过地址传递结构体通常更高效,特别是对于大型结构体,因为它避免了数据的复制。然而,它也可能导致原始数据被意外修改,因此在设计函数时需要谨慎考虑。

总结

  • 通过值传递:函数内部的修改不会影响原始数据,因为传递的是数据的副本。
  • 通过地址传递:函数内部的修改会影响原始数据,因为传递的是数据的地址。

2025年软件测试职业院校技能大赛—ERP管理平台-采购管理采购入库模块测试用例 竞赛对接软件测试相关标准,以“ERP管理平台” 为被测系统,围绕软件测试领域的主流技术及工具,考查选手面 对实际问题的综合分析能力,对测试文档、测试用例的设计能力, 对单元测试、自动化测试、性能测试、接口测试等测试工具及方 法的掌握程度,检验选手团队协作能力、组织规划能力、方法运用能力等。 阅读详情

相关推荐

STM32控制舵机SG-5010转动,HAL库

首先设置时钟为72Mhz,预分频系数为72-1,自动重装载计数器的值为5000-1,这样的话就可以得到一个5ms的脉冲宽度,5000的计数值可以让舵机的旋转角度变得更加易控且相对精准,计算旋转角度的时候也可以更加精确。所以我们5ms脉宽,period是5000脉宽-------------角度----------pulse0.5ms-------------0度----------500;1.0ms------------45度---------1000;

qq_73783264的博客 1292

【C++ Primer Plus】第七章:函数

函数是C++的编程模块。要使用函数,必须提供定义和原型,并调用该函数。函数定义是实现函数功能的代码;函数原型描述了函数的接口:传递给函数的值的数目和种类以及函数的返回类型。函数调用使得程序将参数传递给函数,并执行函数的代码。在默认情况下,C++函数按值传递参数。这意味着函数定义中的形参是新的变量,它们被初始化为函数调用所提供的值。因此,C++函数通过使用拷贝,保护了原始数据的完整性。C++将数组名参数视为数组第一个元素的地址。

Friday 1111

QuestaSim使用Xilinx库的设置

安装QuestaSim

miracle_eicont的专栏 3409

C++PrimerPlus 第七章 函数-C++的编程模块-7.3 函数和数组

目录7.3 函数和数组7.3.1 函数如何使用指针来处理数组7.3.2 将数组作为参数意味着什么?7.3.3 更多数组函数示例7.3.3.1 填充数组7.3.3.2 显示数组及用const保护数组7.3.3.3 修改数组7.3.3.4 将上述代码组合起来7.3.3.5 程序说明7.3.3.6 数组处理函数的常用编写方式7.3.4 使用数组区间的函数7.3.5 指针和const到目前为止,本书的函数示例都很简单,参数和返回值的类型都是基本类型。但是,函数是处理更复杂的类型(如数组和结构)的关键。下面来如何将数

Hank_W 786

Meta DINOv3实战指南:如何用7B参数ViT模型提升你的视觉任务性能(附Hugging Face部署教程)

本文提供了Meta DINOv3 7B参数ViT模型的实战部署指南。文章详细解析了该自监督视觉模型的优势,并重点演示了如何在Hugging Face平台上高效加载这一大规模模型,同时给出了图像分类、语义分割等下游任务的性能提升技巧与代码示例,帮助开发者在实际视觉任务中应用这一前沿技术。

pz89012345的博客 324

YDOOK: ANSYS Maxwell 19 教程7:Maxwell 2D 材料管理 添加新增 永磁材料

使用ANSYS Maxwell 19 添加新增 永磁材料 1. 点击 Add material 按钮后,在左下方的下拉框中下拉选择永磁材料,弹出用材料设置框: 2. 按照下面数据输入 3. 输入 Hc 与 Br/Ap 两项后,其他项的数据将自动计算给出 4. 点击OK后再,为了使得材料属性的完整性,在 Bulk Conductivity 属性行中输入 材料电导率的数值。 ...

YDOOK 1万+

c++ Primer Plus(第六版)第七章习题,写代码之路

c++ Primer Plus(习题7.1) //用户输入啷个数,返回调和平均数 //其中一个为0结束程序 #include using namespace std; double t_average(double a, double b); int main() { cout << "Please two interger: "; double x, y; while (cin >> x

Robot_x的博客 1382

lvds接口_LVDS,接口,时序讲解,非常好的文章

欢迎FPGA工程师加入官方微信技术群点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群1.1.1 LVDS接口分类1.1.1.1 单路6bit LVDS这种接口电路中,采用单路方式传输,每个基色信号采用6位数据,共18位RGB数据,因此,也称18位或18bit LVDS接口。此,也称18位或18bit LVDS接口。1.1.1.2 双路6bit LVDS这种接口电...

weixin_39639286的博客 1902

C++ Primer Plus第六版 第七章 编程练习答案

/******************************************************************************************************************* Author : Yuuji Blog : blog.youkuaiyun.com/acm_yuuji Time : 2014/07/18 From : C++ Prime

蒟蒻升级中...Orz 8157

亚马逊商品评论爬取与情感分析实战:Python+BeautifulSoup高效解析(附反爬技巧)

本文详细介绍了使用Python和BeautifulSoup库高效爬取亚马逊商品评论并进行情感分析的完整实战流程。文章从环境搭建、核心代码编写入手,重点讲解了如何通过设置请求头、添加延迟等防封策略应对反爬机制,确保数据抓取的稳定性。最后,利用TextBlob库对评论文本进行情感分析,并通过可视化图表直观展示产品口碑,为电商选品与市场调研提供数据支持。

weixin_29046611的博客 1164

Cocos Creator 3D音频定位实战:从原理到沉浸感实现

3D音频定位是游戏开发中实现沉浸感的关键技术,其核心原理基于HRTF(头部相关传输函数)模型,模拟声音在空间中的传播与双耳感知差异。这项技术通过赋予声音空间坐标、距离衰减和方向属性,将音频从背景元素提升为可交互的环境线索,极大增强了虚拟世界的真实感与玩家的空间认知。在工程实践中,开发者需要深入理解声源、听者、衰减曲线与多普勒效应等基础概念,并合理运用音频池、优先级管理与动态混音等技术手段来平衡效果与性能。对于Cocos Creator开发者而言,无论是使用引擎原生的AudioSource组件构建轻量级方案,

weixin_30972263的博客 293

C++ primer plus 第七章答案

第一次写博客。。用来记录一下自己写过的题,省的连自己写过什么题都不知道(⊙﹏⊙)。。。期末考试一过完整整两个月没碰C++,好不容易才入的门又给忘干净了,真想抽自己一耳光,慢慢记录!

某科学的瓜皮炮的博客 484

Supreme小程序自动化抢购终端——源码架构与执行流程全解析

本系统是一套基于开发的桌面端小程序自动化抢购终端。把只有开发者能跑的脚本,包装成普通用户也能操作的桌面工具。参数自动捕获 → 商品多关键词检索 → sku/尺码/库存映射 → 多商品任务队列 → 定时/立即抢购 → 订单创建 → 支付参数拉取 → 本地服务生成支付链接 → 手机微信扫码付款这套 Supreme 抢购终端,表面上看是一个"下单工具"。但从工程角度审视,它已经具备了一个小型桌面自动化系统GUI 层:CustomTkinter 现代化界面,线程安全业务层:多商品队列、定时调度、任务编排。

猫敷雪 203

跟着【c++Primer Plus 】第六版 学编程----第七章函数——C ++的编程模块

本章主要介绍了函数如何工作,然后介绍如何使用函数来处理数组、字符串和函数,最后介绍递归和函数指针

qq_58792904的博客 725

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

跟着【c++Primer Plus 】第六版 学编程----第七章函数——C ++的编程模块复习题

@[toc](跟着【c++Primer Plus 】第六版 学编程----第七章函数——C ++的编程模块复习题)

qq_58792904的博客 797

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【C++ Primer Plus】第七章函数C++编程模块脑图主要内容说明

本章脑图

shangpapa3的博客 244

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++ Primer Plus学习笔记:第七章:函数——C++的编程模块

这个系列的文章不是针对C++的初学者写的,当然也不是针对大佬写的,而是写给那些曾经学过旧版的C++而且已经忘了很多东西或者是想知道部分内容的原理的同学,我会把我忘记和可能会忘记的知识点列出来,适当拓展,通过实验加深理解

LiuKairui的博客 1315

C++ primer plus 第七章笔记 函数——C++的编程模块

第七章笔记

G_J_T的博客 645

《C++ primer plus》学习笔记——第七章C++函数的编程模块

文章目录1,函数的基本知识 1,函数的基本知识

喜欢打篮球的普通人 889

C++ Primer Plus(第七章 函数—C++的编程模块)内容精要

C++Primer Plus(第七章 函数—C++的编程模块)内容精要1. C++对于返回值的类型有一定的限制:不能是数组,但可以是其他任何类型——整数、浮点数、指针,甚至可以是结构和对象!(有趣的是,虽然C++函数不能直接返回数组,但可以将数组作为结构或对象组成部分来返回。)2. 为什么需要原型:原型描述了函数到编译器的接口,也就是说,它将函数返回值的类型(如果有的话)以及参数的类型和数量告诉编...

qq_28427119的博客 298

函数——c++的编程模块(c++primer plus 第七章)

函数是c++的编程模块。要使用函数,必须提供定义和原型 ,并调用该函数。函数定义是实现函数功能的代码;函数原型是描述函数的接口;传递给函数的值和数目和种类以及函数的返回类型。函数调用使得程序将参数传递给函数,并执行函数的代码。 默认情况下,c++函数按值传递函数。这意味着函数定义中形参是新的变量,它们被初始化为函数调用所提供的值。因此,c++函数通过使用拷贝,保护了原始数据的完整性。 c++将

静心 1101

C++ Primer Plus 第七章 函数-C++的编程模块

C++ primer plus 学习记录

weixin_43753276的博客 164

C++ Primer Plus:第七章 - 函数——C++的编程模块

0、本章内容: 函数基本知识。 函数原型。 按值传递函数参数。 设计处理数组的函数。 使用const指针参数。 设计处理结构的函数。 设计处理string对象的函数。 调用自身的函数(递归)。 指向函数的指针。 1、复习函数的基本知识: 提供函数定义、提供函数原型、调用函数。 1.1 定义函数 分为有返回值和没有返回值的函数。 1.2 函数原型和函数调用 函数原型可以不提供变量名。 不指定...

qq_30534935的博客 268

【c++ primer plus】第七章-函数——c++的编程模块

函数的定义分为有返回值和无返回值,有返回值在c++中国不可以是数组,可以是整数浮点数指针,甚至可以是结构和像。(可以将数组放在结构中返回),它们向调用函数返回一个值,然后函数原型将他们返回给变量或者是显示或是别的用途。注:假设if和else语句都带有返回值,则执行第一条代码返回的值。

m0_73584556的博客 112

C++学习之路(六),C++primer plus 第七章 函数--C++的编程模块

   第 7 章 函数---C++的编程模块    本章内容包括:    函数基本知识。    函数原型。    按值传递函数参数。    设计处理数组的函数。    使用 const 指针参数。    设计处理文本字符串的函数。    设计处理结构的函数。    调用自身的函数(递归)。    指向函数的指针。   乐趣在于发现。仔细研究,读者将在函数中找到乐趣。C++自带了一个包含...

hsoftk的博客 1351

C++ Primer Plus 第七章答案 函数——C++的编程模块

老样子 复习题+编程练习 //7.12 //1 定义函数,提供原型,调用函数 //2 void igor(); float tofu(int); double mpg(double, double); long sumation(long[], int n); double doctor(const char[]); void ofcourse(boss); char* plot(map*); //3 void becint(int arr[], int

qq_56677326的博客 242
上一篇: C++ Primer Plus笔记 第一章 ~第六章(立贴,陆续更新)
下一篇: C++ Primer Plus第八章 函数探幽
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值