当前位置: 首页 > news >正文

并非从0开始的c++ day6

并非从0开始的c++ day6

  • 二级指针练习-文件读写
  • 位运算
    • 位逻辑运算符
      • 按位取反 ~
      • 位于(AND):&
      • 位或(OR): |
      • 位异或: ^
    • 移位运算符
      • 左移<<
      • 右移>>
  • 多维数组
    • 一维数组
      • 数组名
      • 一维数组名传入到函数参数中
      • 数组指针
        • 1、先定义出数组的类型,在通过类型定义出数组指针
        • 2、先定义出数组指针的类型,通过类型创建数组指针变量
        • 3、直接定义数组指针变量
    • 二维数组
      • 二维数组的定义
      • 二维数组做函数参数

二级指针练习-文件读写

需求:在代码根目录下,新建一个txt文件,输入若干行字符,读取并一个个输出出来

//获取文件中有效的函数
int getFileLines(FILE * file)
{if (file == NULL){return -1;}char buf[1024];int lines = 0;while (fgets(buf, 1024, file) != NULL){lines++;//printf("%s\n", buf);}//将文件的光标 置首fseek(file, 0, SEEK_SET);//SEEK_SET//SEEK_CUR//SEEK_ENDreturn lines;
}void readFileData(FILE * file,char ** pArray,int len)
{if (file == NULL){return;}if (pArray == NULL){return;}if (len < 0){return;}char buf[1024] = { 0 };int count = 0;while (fgets(buf, 1024, file) != NULL){//计算开辟每个字符串的大小int currentLen = strlen(buf)+1;//字符串最后字符改为\0buf[strlen(buf) - 1] = '\0';//开辟堆区空间char * currentP = malloc(sizeof(char) * currentLen);//将文件中读取的内容,放入到开辟的空间中strcpy(currentP, buf);//将开辟空间的数据,放入到我们维护的数组中pArray[count++] = currentP;//清空bufmemset(buf, 0, 1024);}
}//打印数组
void showFileData(char** pArray, int len)
{for (int i = 0; i < len; i++){printf("%d行的数据为:%s\n", i + 1, pArray[i]);}
}//释放堆区空间
void freeSpace(char** pArray, int len)
{for (int i = 0; i < len; i++){if (pArray[i] != NULL){printf("%s被释放了\n", pArray[i]);free(pArray[i]);pArray[i] = NULL;}}free(pArray);pArray = NULL;
}void test01() 
{//打开文件FILE * file = fopen("./test.txt", "r");if (file == NULL){printf("文件打开失败\n");return;}//获取文件有效函数int len = getFileLines(file);printf("文件的有效行数为:%d\n", len);char** pArray = malloc(sizeof(char*) * len);//将文件中的数据放入到pArray的数组中readFileData(file, pArray, len);//打印数组showFileData(pArray,len);//释放堆区空间freeSpace(pArray,len);pArray = NULL;//关闭文件fclose(file);file = NULL;
}

FILE * file = fopen(“./test.txt”, “r”);
为读取文件的命令,r代表读

在getFileLines读取了file指针后,指针已经发生了偏移,若没有重置,直接再次调用,会报错
故这里使用memset重置,SEEK的三个可选项分别对应当前位置(cur)、开头(set)、末尾(end)

txt文件中内容自带换行,故在print的时候不需要手动加\n来换行
若不需要文件自带换行,想自己换的话,需要在读取的时候,将字符串最后一个字符改为\0即可

free的个数要对应malloc的个数,free要先free指针底下的内容,再释放指针自身,要不然底下的东西会变成无法访问的垃圾

位运算

位逻辑运算符

按位取反 ~

一元运算符~ 将每一1变为0,将每个0变为1

void test01()
{int num = 2;printf("~num = %d\n", ~num);// -3//0000 0010~ 1111 1101源码 ~1000 0011 补码 
}

这样得到的结果为-3,因为数据经过取反补码,就是符号位转变后加一

位于(AND):&

二进制运算符&通过对两个操作数逐位进行比较产生一个新值。对于每个位,只有两个操作数的对应位都是1是结果才为1。

同真为真,其余为假

void test02()
{int num = 123;if ((num & 1 )== 0){printf("偶数\n");}else{printf("奇数\n");}
}

位或(OR): |

同假为假,其余为真

void test03()
{int num1 = 5;int num2 = 3;printf("num1 | num2 = %d\n", num1 | num2);
}

可运用于将某个位变为1

位异或: ^

同样为真,不同为假

a:00101110
b:11000111
r:11101001
a^b =r a^r= b b^r = a

void test04() {int num1 = 5;int num2 = 9;//实现两个数字交换num1 = num1 ^ num2;num2 = num1 ^ num2;num1 = num1 ^ num2;printf("num1 = %d\n", num1);printf("num2 = %d\n", num2);}

移位运算符

左移<<

(10001010)<<2
(00101000)

<< n 代表乘以2^n

void test05()
{int num = 20;printf("%d\n", num <<= 3);
}

右移>>

>> n 代表如果number非负,则number除以2^n

void test06()
{int num = 20;printf("%d\n", num >>= 1);
}

多维数组

一维数组

  • 元素类型角度:数组是相同类型的变量的有序集合
  • 内存角度:连续的一大片内存空间

数组名


void test01()
{int arr[5] = { 1,2,3,4,5 };printf("sizeof arr = %d\n", sizeof(arr));printf("%d\n", &arr);printf("%d\n", &arr+1);int* p = arr;p = p + 3;printf("%d\n", p[-1]);
}

//一维数组的名 是不是指向第一个元素的指针
//对数组名 取地址 可得步长为20
//第一种 对数组名称 sizeof
//第二种 对数组名称取地址 步长为整个数组长度
//除了这两种情况以外,一维数组名 指向数组第一个元素的指针

//指针常量 int * const p 常量指针const int * p
//前者为指针常量,要指针指向的值才能修改,后者为常量指针,指针指向的值不能改,但指针本身能改

//数组名 要是指针常量
//arr = NULL;//指针的指向是不可以修改的
//arr[0] = 100;//指针指向的值是可以修改的

//如果将指针偏移过,则访问的时候可以为负数

一维数组名传入到函数参数中

void printArray(int  arr[],int len)//int arr[] 等价于 int *arr
{for (int i = 0; i < len; i++)printf("%d\n", arr[i]);//等同于*(arr+i)
}void test02()
{int arr[5] = { 1,2,3,4,5 };int len = sizeof(arr) / sizeof(int);printArray(arr, len);
}

数组指针

1、先定义出数组的类型,在通过类型定义出数组指针

void test01()
{int arr[5] = { 1,2,3,4,5 };typedef int(ARRAY_TYPE)[5];//ARRAY_TYPE是一个有5个int元素的数组的类型ARRAY_TYPE* arrP = &arr;//*arrP ==== arrfor (int i = 0; i < 5; i++){printf("%d\n", (*arrP)[i]);}
}

2、先定义出数组指针的类型,通过类型创建数组指针变量

void test02()
{int arr[5] = { 1,2,3,4,5 };typedef int(*ARRAY_TYPE)[5];ARRAY_TYPE arrp = &arr;//可以使用,但是比较麻烦printf("%d\n", *arrp[0]);
}

3、直接定义数组指针变量

void test03()
{int arr[5] = { 1,2,3,4,5 };//语法:数组元素类型(*数组指针变量名称)[元素个数]int(* p)[5] = &arr;//*p == arrfor (int i = 0; i < 5; i++){printf("%d\n", (*p)[i]);}
}

二维数组

二维数组的定义

void test01()
{int arr[3][3] ={{1,2,3},{2,3,4},{4,5,6}};int arr2[3][3] = { 1,2,3,4,5,6,7,8,9 };int arr3[][3] = { 1,2,3,4,5,6,7,8,9 };
}

三种定义方法,第一种可读性最强

二维数组做函数参数

void printArray(int (*pArray)[3],int len1,int len2)//(*pArray)[3] 也可以表述为pArr[3][3]更加易读
{for (int i = 0; i < len1; i++){for (int j = 0; j < len2; j++){printf("%d ", pArray[i][j]);printf("%d ", *(*(pArray+i)+j));}printf("\n");}
}void test02()
{int arr[3][3] ={{1,2,3},{4,5,6},{7,8,9}};printArray(arr, 3, 3);//sizeofprintf("sizeof arr= %d\n", sizeof(arr));//取地址printf("%d\n", &arr);printf("%d\n", &arr + 1);int(* p)[3][3] = &arr;
}

sizeof获取整个二维数组占用内存大小
取地址步长为整个二维数组长度
除了这两种情况,二维数组名指向第一行数组的数组指针

相关文章:

并非从0开始的c++ day6

并非从0开始的c day6二级指针练习-文件读写位运算位逻辑运算符按位取反 ~位于&#xff08;AND&#xff09;&#xff1a;&位或&#xff08;OR&#xff09;&#xff1a; |位异或: ^移位运算符左移<<右移>>多维数组一维数组数组名一维数组名传入到函数参数中数组指…...

PMP考前冲刺2.22 | 2023新征程,一举拿证

承载2023新一年的好运让我们迈向PMP终点一起冲刺&#xff01;一起拿证&#xff01;每日5道PMP习题助大家上岸PMP&#xff01;&#xff01;&#xff01;题目1-2&#xff1a;1.在新产品开发过程中&#xff0c;项目经理关注到行业排名第一的公司刚刚发布同类型的产品。相比竞品&am…...

RxJava的订阅过程

要使用Rxjava首先要导入两个包&#xff0c;其中rxandroid是rxjava在android中的扩展 implementation io.reactivex:rxandroid:1.2.1implementation io.reactivex:rxjava:1.2.0首先从最基本的Observable的创建到订阅开始分析 Observable.create(new Observable.OnSubscribe<S…...

【2.22】MySQL、Redis、动态规划

认识Redis Redis是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成的&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列&#xff0c;分布式锁等场景。 Redis提供了多种数据类型来支持不同的业务场景&#xff0c;比如String(字符串…...

2年手动测试,裸辞后找不到工作怎么办?

我们可以从以下几个方面来具体分析下&#xff0c;想通了&#xff0c;理解透了&#xff0c;才能更好的利用资源提升自己。一、我会什么&#xff1f;先说第一个我会什么&#xff1f;第一反应&#xff1a;我只会功能测试&#xff0c;在之前的4年的中我只做了功能测试。内心存在一种…...

Leetcode6. N字形变换

一、题目描述&#xff1a; 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; 之后&#xff0c;你的输出需要从左往右逐行读取&#xff0c;产…...

将Nginx 核心知识点扒了个底朝天(十)

ngx_http_upstream_module的作用是什么? ngx_http_upstream_module用于定义可通过fastcgi传递、proxy传递、uwsgi传递、memcached传递和scgi传递指令来引用的服务器组。 什么是C10K问题? C10K问题是指无法同时处理大量客户端(10,000)的网络套接字。 Nginx是否支持将请求压…...

GPU显卡环境配置安装

前言 最近公司购买了一张RTX3090的显卡和一台新的服务器&#xff0c;然后对机器的GPU环境进行了安装和配置&#xff0c;然后简单记录一下 环境版本 操作系统&#xff1a;Centos7.8 显卡型号&#xff1a;RTX3090 Python版本&#xff1a;3.7.6 Tensorflow版本&#xff1a;2…...

CIMCAI super unmanned intelligent gate container damage detect

世界港航人工智能领军者企业CIMCAI中集飞瞳打造全球最先进超级智能闸口无人闸口ceaspectusG™视频流动态感知集装箱箱况残损检测箱况残损识别率99%以上&#xff0c;箱信息识别率99.95%以上World port shipping AI leader CIMCAIThe worlds most advanced super intelligent gat…...

web概念概述

软件架构&#xff1a;1. C/S: Client/Server 客户端/服务器端* 在用户本地有一个客户端程序&#xff0c;在远程有一个服务器端程序* 如&#xff1a;QQ&#xff0c;迅雷...* 优点&#xff1a;1. 用户体验好* 缺点&#xff1a;1. 开发、安装&#xff0c;部署&#xff0c;维护 麻烦…...

编译原理笔记(1)绪论

文章目录1.什么是编译2.编译系统的结构3.词法分析概述4.语法分析概述5.语义分析概述6.中间代码生成和后端概述1.什么是编译 编译的定义&#xff1a;将高级语言翻译成汇编语言或机器语言的过程。前者称为源语言&#xff0c;后者称为目标语言。 高级语言源程序的处理过程&#…...

MySQL(八)

服务器参数设置 general datadir/var/lib/mysql 数据文件存放的目录socket/var/lib/mysql/mysql.sock mysql.socket表示server和client在同一台服务器&#xff0c;并且使用localhost进行连接&#xff0c;就会使用socket进行连接pid_file/var/lib/mysql/mysql.pid 存储mysql的p…...

steam搬砖项目,小投入高回报,可放大操作,(内附教学资料)

我必须要说&#xff0c;steam搬砖项目就是全网门槛最低的副业&#xff0c;有手就行&#xff01; 本人90后底层员工一枚&#xff0c;新入csgo搬砖项目&#xff0c;轻松翻身 什么做抖音、海外问卷、直播卖货&#xff0c;电商等等对比我这个都是小钱。我这个方法是利用了大部分人…...

华为OD机试真题Python实现【最多提取子串数目】真题+解题思路+代码(20222023)

最多提取子串数目 题目 给定由 [a-z] 26 个英文小写字母组成的字符串 A 和 B,其中 A 中可能存在重复字母,B 中不会存在重复字母 现从字符串 A 中按规则挑选一些字母,可以组成字符串 B。 挑选规则如下: 1) 同一个位置的字母只能被挑选一次 2) 被挑选字母的相对先后顺序不…...

day32 多线程(上)

文章目录相关概念codeThreadTest01ThreadTest02 编写一个类&#xff0c;直接继承java.lang.Thread&#xff0c;重写run方法ThreadTest03 实现线程的第二种方法ThreadTest04 采用匿名内部类的方式ThreadTest05 获取线程名字ThreadTest06 sleep方法sleep面试题ThreadTest08 终止线…...

【flink】 各种join类型对比

表定义 动态表(dynamic table)&#xff1a;动态表是流的另一种表达方式&#xff0c;动态表作为一个逻辑的抽象概念&#xff0c;使我们更容易理解flink中将streaming发展到table这个层次的设计&#xff0c;本质都是对无边界、持续变更数据的表示形式&#xff0c;所以动态表与流之…...

常用正则表达式

一、校验数字的表达式 数字&#xff1a;^[0-9]*$ n位的数字&#xff1a;^\d{n}$ 至少n位的数字&#xff1a;^\d{n,}$ m-n位的数字&#xff1a;^\d{m,n}$ 零和非零开头的数字&#xff1a;^(0|[1-9][0-9]*)$ 非零开头的最多带两位小数的数字&#xff1a;^([1-9][0-9]*)(.[0…...

PMP考试有没有什么技巧可以介绍一下么?

一、试题形式 ——中英文对照 即每道题都是一遍英文&#xff0c;一遍翻译的中文&#xff0c;在审题的时候有一些小的技巧需要注意。首先如果你的英文水平足够好&#xff0c;建议直接阅读原文。PMP试题毕竟是美国人出的&#xff0c;语言的组织、思想的表达&#xff0c;肯定更符…...

2022-2023年营销报告(B站平台) | 5大行业势态、流量大盘全景洞察

一直以来&#xff0c;手持高活跃、高粘性用户群体的B站是行业用来观察年轻人消费习惯的重要平台。以至于用户群体的不断壮大带动了B站的商业价值。如今B站的商业舞台越来越大&#xff0c;不断地向外界招手&#xff0c;欢迎更多品牌积极加入到这个千万年轻人聚集的内容社区。为了…...

Python的异常与工具包

异常 当检测到一个错误时&#xff0c;python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的异常。 捕获异常 世界上没有完美的程序&#xff0c;任何程序在运行的过程中&#xff0c;都有可能出现异常&#xff0c;导致程序无法完美运行…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...