c++综合学习

news2024/12/23 6:05:56

1.函数调用

  • 传值调用:在函数内部修改形式参数,不改编实际参数的值;
  • 引用调用:即指针调用,传入的是变量的指针,则在函数内部修改形式参数,实际参数跟着改变。

2. 数组

  • 数组名即该数组的首地址;
  • 首地址:一段内存空间中第一个存储单元的地址
  • 一维数组作为函数参数三种方法:函数定义方法void my_function(int *a)、void my_function(int a[10])、void my_function(int a[]),就函数定义而言,数组的长度是无关紧要的,因为C不会对形式参数执行边界检查,这三种方法传递数组的本质都是传递一个指针,即数组的首地址;
  • 从函数返回数组:如果想从函数返回一个一维数组,必须声明一个返回指针的函数int *my_function(){},另外C不支持在函数外部返回局部变量的地址,除非定义局部变量为static,即静态变量。
  • 指针加减:以指针所指向的类型空间为单位进行偏移。
  • 二维数组:int a[3][4]={{6,3,2,4},{2,1,3,1},{2,3,1,4}};a代表的是数组中第一个存储单元即{6324}的地址,同理a+1是第二个存储单元即{2,1,3,1}的地址。如访问a[1][2],还可通过*(a[1]+2)、*(*(a+1)+2)访问。
  • 二维数组作为函数参数三种方法:int a[3][4],int a[][4],(int *p)a[4],数组的一维长度可以不写,但二维必须要写,因为实参传递来的是数组全局第一个元素6的起始地址,如果形参中不说明列数,编译器将无法定义其它元素的位置。

3. 函数指针与回调函数

        一个数据变量的内存地址可以存储在相应的指针变量中,函数的首地址也以存储在某个函数指针变量中。这样,我就可以通过这个函数指针变量来调用所指向的函数了。

     C系列语言中,任何一个变量,总是要先声明,之后才能使用的。函数指针变量也应该要先声明。函数指针变量的声明:

     void (*funP)(int) ;   //声明一个指向同样参数、返回值的函数指针变量。

  • 函数指针:一个指向函数的指针变量,函数指针可以像一般函数一样,可以调用函数、传递参数;
  • 函数指针变量的声明:int (*fun_ptr)(int, int);
  • 回调函数:函数指针变量可以作为某个函数的参数来使用的,回调函数是一个通过函数指针调用的函数。

4. 打印输出

  • %x输出地址(int数组指针加1,则地址加4,因为一个整数占4个字节)
  • %d 输出整数
  • %f 输出小数(单精度双精度),
  • %.2f 输出到小数点后两位
  • %c 输出字符
  • %s 输出字符串: 声明字符串str,字符串本质是字符数组,末尾自动以‘\0’作为字符串结束的标志,‘\0’不计入字符串长度:Char str = {‘H’,’e’,’l’,’l’,’o’};printf(“%s”,str)给出字符串的首地址即可打印该字符串)

5. 结构体

数组存储的是相同类型的变量,结构体允许存储不同类型的数据项。

  • 结构体定义:struct tag

                                {member_list;

  •                                 member_list;
    •                                 …
      •                                 }variable_list;
      • 结构体定义必须使用struct语句,tag是结构体标签,member_list是变量定义,variable_list是结构体变量。
  • 访问结构体成员:结构体变量通过.访问,结构体指针通过->访问;
  • 结构体变量可作为函数参数;
  • 结构体指针:struct tag *p,是一个该结构体类型的指针,不能直接对该指针里的内容赋值,错误操作:p->a = 10;需先将一个同类型结构体变量地址赋值给它。就像int *p错误操作:*p = 10;凡是指针必须先指定指针里面存放的地址才能对指针里面的内容进行赋值更改;
  • 指向自己类型的指针:结构体里除了一些其它数据类型还有一个指向自己类型的指针,通过该指针可将各结构体连接起来形成一个链表,可用于快速删除和添加节点。

        struct NODE { int a; struct NODE *next_node; };

  •          struct NODE node1={12},node2={13},node3={14};
    •         node1.next_node = &node3;(此时node1里面的指针存放node3地址)
      •         node3.next_node = &node2;(此时node3里面的指针存放node2地址)                                        printf(“%d”,node1.next_node->next_node->a);输出13。
  • 6. 位域

        位域:有些信息在存储时,并不需要占用一个完整的字节,例如在存放一个开关量时,只有 0 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域"。

  • 一个位域存储在同一个字节中,如一个字节所剩空间不够存放另一位域时,则会从下一单元起存放该位域
  • 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位
  • struct bs{ int a:8; int b:3; int c:5; }data; 其中 data bs 变量,共占两个字节。其中位域a8位,位域b3位,位域c5位。bit.b=7; /* 给位域赋值应注意赋值不能超过该位域的允许范围,b3位,所以赋值不能超过8 */

7. 共用体

        必须使用union语句。允许在相同的内存位置存储不同的数据类型。你可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体占用的内存应是共用体中最大成员所占的字节数。

  • union Data { int i; float f; char str[20]; } data;

8. 字符串

  • 单字符输入输出:要想输入输出多个字符,可使用循环。int c = getchar()从键盘输入一个字符,返回的是该字符的ASCII;putchar(c),接收的是ASCII吗,在屏幕上输出的是对应的字符;
  • gets(str)输入字符串,一般按空格键可结束输入,puts(str)输出字符串。

9. fseek

  • int fseek(FILE *stream , int offset , int whence);(如果成功则该函数返回零,否则返回非零)

        whence:指定了指针从哪个位置开始偏移,一般指定为以下常量

        SEEK_SET(文件的开头)

        SEEK_CUR(文件指针的当前位置)

        SEEK_END(文件的末尾)

        offset:相对whence的偏移量,以字节为单位

        stream:指向FILE对象的指针

10. fread

  • size_t fread(*ptr , size_t size, size_t nmemb, FILE *stream);(成功会返回元素个数)

        ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。

        size -- 这是要读取的每个元素的大小,以字节为单位。

        nmemb -- 这是元素的个数,每个元素的大小为 size 字节。

        stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。

11. fwrite

  • size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

        ptr -- 这是指向要被写入的元素数组的指针。

        size -- 这是要被写入的每个元素的大小,以字节为单位。

        nmemb -- 这是元素的个数,每个元素的大小为 size 字节。

        stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。

12. ftell

  • int ftell(FILE *stream);(返回当前指针的位置)

        stream--这是指向FILE对象的指针,该FILE对象标识了流。

13. calloc

  • void *calloc(size_t nitems, size_t size)

        nitems -- 要被分配的元素个数。

        size -- 元素的大小。

        malloc calloc 之间的不同点是,malloc 不会设置内存为零,而 calloc 会设置分配的内存里面内容为零。

14. memset

  • memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符(按字节填充,比如

        int *a = NULL;

        a = (int*)calloc(3,sizeof(int));

      memset(a, 1, 2);//将前面两个字节填充1,所以第一个数应该是00000000 00000000 00000001 00000001257,第二、三个数都为0,因为calloc分配内存时会设置内存为0

        对于有符号的整数:先转化为二进制,然后取反码,再取补码(反码+1)

        比如十六进制0xffff e0ba

        原码:1111 1111 1111 1111 1110 0000 1011 1010(二进制码)

        反码:1000 0000 0000 0000 0001 1111 0100 0101(第一位是符号位)

        补码:1000 0000 0000 0000 0001 1111 0100 0110(反码加1)

        十进制:-8006

15. 引用

  • 引用的作用:给变量起别名

        注意事项:

                   int a = 10;

                   int b = 10;

        int &c;    //错误,引用必须初始化;

        int &c = a;  //一旦初始化就不可以修改

        c = b;     //这是赋值操作,不是更改引用;

        引用的本质:引用的本质是一个指针常量(指针指向不可以修改)

        int a = 10;

        int &ref  = a; //int* const ref = &a;(编译器会这样做)

        ref = 20; //*ref = 20(编译器会这样做)

常量引用

使用场景(用来修饰形参,防止误操作): 加上const在函数体里就不能对v进行修改了,如果不加const,函数体里面对v修改了,则函数外相应也会被修改;

void fun_name(const int &v) {

 函数体;

}

int &ref = 10;      //会提示错误,引用必须引用一块合法的内存空间

const int &ref = 10; //加上const之后就可以,加上const之后,编译器会将代码修改为:

int temp = 10; const int &ref = temp;

ref = 20;  //会提示错误,加入const后变为只读,不可以做修改。

17. 内存分区模型

c++程序在执行时,将内存大方向划分为4个区域:

  • 代码区:存放函数体的二进制代码,由操作系统进行管理;
  • 代码区是共享的,共享的目的是对于多次双击执行的程序,只需在内存中有一份代码即可;
  • 代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令;
  • 全局区:存放全局变量和静态变量及常量(字符串常量、const修饰的全局常量);
  • 该区域的数据在程序结束后由操作系统释放;
  • 栈区:由编译器自动分配释放,形参数据、局部变量等;
  •   栈区的数据在函数执行完后自动释放,所以不要返回局部变量的地址;
  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收;
  • c++中主要用new在堆中开辟内存, 用delete释放堆中的内存;
  • int *p = new int(3); //利用new创建的数据,会返回该数据类型的指针;
  • cout<<*p<<endl;//输出3
  • delete p;
  • cout<<p<<endl;//会报错,该内存已释放,再去访问就属于非法访问;     
  • //在堆区创建数组
  • int *arr = new int[3]; //代表数组有3个元素,返回数组的首地址;
  • delete[] arr; //释放数组的时候,要加[]才可以;

17. 空指针和野指针

空指针:指针变量指向内存编号为0的空间;

用途:初始化指针变量;

注意:空指针指向的内存是不允许访问的;

野指针:指针变量指向非法的内存空间;

int *p = (int *)0x1100; //指针变量p指向内存地址编号为1100的空间;

cout<<*p<<endl; //访问野指针报错(因为这段内存并没有申请,只是直接指向它)

18. const修饰指针

常量指针:const修饰指针,指针的指向可以修改,但是指针指向的值不可以修改;

const int *p = &a;

*p = 20; //错误,指针指向的值不可以修改;

p = &b; //正确,指针指向可以修改

指针常量:const修饰常量,指针的指向不可以修改,指针指向的值可以修改;

int * const p = &a;

*p = 20;//正确,指向的值可以修改;

p = &b;//错误,指针指向不可以修改

const既修饰指针又修饰常量:指针的指向和指针指向的值不可以修改;

const int * const p = &a;

19. 函数默认参数

如果某个参数已经有了默认参数,那么从这个位置往后,从左到右都必须有默认值;

如果函数声明有默认参数,函数实现就不能有默认参数(声明和实现只能有一个有默认参数);

20. 函数的分文件编写

  • 创建.h头文件
  • 创建.cpp源文件
  • 在头文件中写函数的声明
  • 在源文件中写函数的定义

21. c++面向对象三大特性:封装、继承、多态

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

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

相关文章

chatgpt赋能Python-python_9

Python 9&#xff1a;提高SEO排名的最佳解决方案 对于许多公司和品牌&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;是一项至关重要的任务。仅依靠传统广告和宣传的时代已经过去了&#xff0c;现在需要利用搜索引擎来增加流量和吸引更多客户。而Python 9则是一款已经被…

Linux权限2详解

粘滞位 现在我们学习了目录和普通文件的权限后&#xff0c;对这两种类型的文件权限都有了深刻的理解和认识&#xff0c;但是这又衍生出了一个新问题&#xff0c;这些目录/普通文件的使用都很局限&#xff0c;一旦设定了权限&#xff0c;别人都无法访问。 举个生活的例子&#x…

Jmeter性能测试工具之性能测试的概念

性能测试的概念 性能测试是指通过特定方式&#xff0c;对被测系统按照一定策略施加压力&#xff0c;获取系统 响应时间、TPS&#xff08;Transaction Per Second&#xff09;、吞吐量、资源利用率等性能指标&#xff0c;以期保证生产系统的性能能够满足用户需求的过程。 性能…

坚持刷题2个月,终于......

最近一个读者和我反馈&#xff0c;他坚持刷题2个月&#xff0c;终于去了他梦寐以求的大厂&#xff0c;薪资涨幅非常可观&#xff0c;期间面字节跳动还遇到了原题…并表示目前国内的大厂和一些独角兽&#xff0c;已经越来越效仿硅谷公司的做法&#xff0c;通过面试给定题&#x…

存放页的大池子——InnoDB表空间

在上一章节中&#xff0c;我们知道了提到了表空间&#xff0c;表空间里面没有直接存放表&#xff0c;有的是许多许多的页&#xff0c;我们也说了表空间的分类&#xff0c;有系统表空间&#xff0c;独立表空间&#xff0c;其他表空间。 每个新建的表都会在对应的数据库目录里面…

性能优化之影响分析

页面性能的影响 性能非常重要&#xff0c;而具体反映到我们的业务场景中&#xff0c;可能会有如下影响&#xff1a; 不利于用户留存 站点页面的展现速度非常影响用户体验&#xff0c;很多用户会因等待的不耐而放弃站点。研究表明&#xff0c;47 % 的消费者希望页面能够在 2s …

chatgpt赋能Python-python_bonjour

Python Bonjour&#xff1a; 通过Python实现Bonjour协议 介绍 Bonjour是苹果公司推出的一种新型、免配置的网络协议&#xff0c;它可以使局域网中的电脑、打印机、电话等各种设备自动发现及配置&#xff0c;从而促进了网络设备的普及。Python作为一种高效、简洁、易学的语言&…

【WSN覆盖】基于麻雀搜索算法的三维混合无线传感器网络覆盖优化 三维WSN覆盖空洞修复【Matlab代码#25】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. SSA算法2. 节点感知模型3. 三维混合WSN覆盖问题4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 1. SSA算法 2. 节…

机器学习与深度学习——通过奇异值分解算法压缩图片

机器学习与深度学习——通过奇异值分解算法压缩图片 什么是奇异值分解&#xff1f; 奇异值分解&#xff08;Singular Value Decomposition&#xff0c;SVD&#xff09;是一种重要的线性代数方法&#xff0c;用于将一个矩阵分解成三个部分的乘积形式。它的应用非常广泛&#x…

Leecode98

leecode98 验证二叉搜索树 给定一个二叉树&#xff0c;判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征&#xff1a; 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 &#x1…

【Linux】shell编程—Here Document免交互

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、免交互概述二、免交互常规用法1.read 命令的读取2.wc -l 的内容行数统计3.passwd用户密码的修改4.cat 查看内容并输出到文件中5.cat 查看交互内容并输出到新的文…

Spring传播机制(七种)

一、概述 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。Propagation枚举则引用了这些类型&#xff0c;开发过程中我们一般直接用Propagation枚举。 1.1 Propagation源码 public enum Propagation {REQUIRED(0),SUPPORTS(1),MANDATORY(2),REQUIRES_NEW(…

redis源码浅析-ziplist实现

redis中的list是有多种实现的&#xff0c;其中一种是ziplist&#xff0c;其介绍如下 ziplist 是一个经过特殊编码的双向链表&#xff0c;旨在提高内存效率。 它存储字符串和整数值&#xff0c;其中整数被编码为实际整数而不是一系列字符。 它允许在 O(1) 时间内在列表的任一侧进…

戴尔 Dell Latitude E7480电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件配置 硬件型号驱动情况 主板戴尔 Dell Latitude E7480 处理器Intel Core i7-7700U已驱动 内存8GB 2133MHz DDR4 * 2已驱动 硬盘Sandisk 1T M.2 NVMe SSD已驱动 显…

windows解决python安装django架构没有django-admin命令

目录 一.尝试安装与配置 1.直接pip命令安装 2.用pycharm测试 3.官网下包安装 二.解决 1.找到django安装的路径 2.配置系统变量 3.测试创建项目 3.1.执行访问页面 3.2.解决 3.3.继续测试 4.pycharm打开 一.尝试安装与配置 1.直接pip命令安装 pip install django dja…

chatgpt赋能Python-python_7

Python 7 - 探索最受欢迎的Python版本 如果你是一位Python开发人员&#xff0c;你就会知道Python 7是什么。Python 7是Python编程语言的第7个主要版本&#xff0c;它带来了许多新的功能和改进&#xff0c;包括内置类型注释、上下文变量、字节码优化和更多。 在本文中&#xf…

度小满科技金融迭代:普惠小微与技术创新并肩而行

2015年&#xff0c;深度贫困乡镇隘口镇推出“本土人才”政策,呼吁大学生人才下基层,助力乡村经济振兴工作。 叶茂的人生轨迹因此而发生改变。彼时&#xff0c;20多岁的叶茂果断辞去药材公司的高薪工作&#xff0c;开始了回乡种植黄精的创业路&#xff0c;并成功竞选东坪村村主任…

log4cpp的安装(vs/visual studio版)

log4cpp安装下载源visual studio安装方法 log4cpp安装 下载源 log4cpp visual studio安装方法 将下载好的压缩包解压缩后得到下列目录&#xff08;解压缩的文件夹最好放C盘&#xff0c;不然在编译阶段往往会出现链接不上的问题&#xff09; 找到mscv10文件夹内的mscv10.sl…

【概念篇】浅谈 AOP、OOP、DDD、IOC

前言 在招聘要求中&#xff0c;有没有经常看见&#xff0c;对AOP、OOP、DDD、IOC有一定的认识&#xff0c;能够自主开发模块&#xff0c;这一类的要求。听起来是不是挺高大上&#xff0c;然后百度一搜&#xff0c;给你出来一堆概念性的东西——结果就是&#xff0c;东西…

《LKD3粗读笔记》(14)块I/O层

什么是块设备&#xff1f; 系统中能够随机访问固定大小数据片的设备被称为块设备&#xff0c;这些数据片称作块&#xff0c;最常见的块设备是硬盘。什么是字符设备&#xff1f; 字符设备按照字符流的方法被有序访问&#xff0c;像串口和键盘就都属于字符设备。这两种设备的区别…