C语言复杂表达式与指针高级
一、指针数组与数组指针
1.指针数组VS数组指针
(1)指针数组:实质是一个数组,因为这个数组中传参的内容全部是指针变量。
(2)数组指针:实质是一个指针,这个指针指向一个数组
2.分析指针数组与数组指针的表达式
注意点:符号的优先级有什么作用?其实是决定当2个符号一起作用的时候决定哪一个符号先运算,哪一个符号后运算。
【】,. ,->这几个优先级比较高
(1)int *p[5];
核心:p
第一个结合:p[5]---》【数组的(【】)优先级比指针(*)高】
第二个结合:*p[5]---》整一个指针数组
因为p先跟【】组合所以是数组,在跟*结合所以是指针,合起来就是指针数组【先结合起来的放在后面】
数组有5个元素大,数组中的元素都是指针,指针指向的元素类型是int类型的,整个符号是一个指针数组。
(2)int (*p)[5]
核心:p---》p是一个指针
第一个结合:(*p)【】--》数组指针
p先和*结合,所以是指针,在和【】结合,所以是数组指针【先结合起来的放在后面】
指针指向一个数组,数组有5个元素,数组中存的元素是int类型,是一个数组
(3)Int *(p[5])
核心:p
第一个结合:p[5]--->数组
第二个结合:* (p[5])---》是指针数组
因为p先跟【】组合所以是数组,在跟*结合所以是指针,合起来就是指针数组【先结合起来的放在后面】
数组有5个元素大,数组中的元素都是指针,指针指向的元素类型是int类型的,整个符号是一个指针数组。
(4)总结
(1)一般规律,Int *p(p是一个指针)
int p[5](p是一个数组)
(2)我们在定义一个符号时,关键在于:首先搞清楚你定义的符号是谁
第一步:找核心;
第二步:看谁和核心最近,谁根核心结合;
第三步:以后继续向外结合
(3)如果核心与*结合,表示核心是指针;如果核心和【】结合,表示核心是数组;如果核心和()结合,表示核心是函数
(4)用一般规律
3.总结
1.优先级和结合性是分析符号意义的关键
2.学会逐层剥离的方法
找到核心后从内向外层进行结合,结合之后可以把已经结合的部分当成一个整体,再去和整体外部的继续进行结合
二、函数指针与typedef
1.函数指针的实质(还是指针变量-->存放函数地址)
(1)函数指针的实质还是指针,还是指针变量,本身占4字节(在32位系统中,所有的指针都是4字节)
(2)函数指针,数组指针,普通指针之间并没有本质区别,区别在于指针指向的大小是什么东西
(3)函数的实质是一段代码,这一段代码在内存中是连续分布的(一个函数的大括号括起来的所有语言将来编译出来生成的可执行程序是连续的),所以对应函数来说很关键的就是函数中的第一句代码的地址,这个地址就是所谓的函数地址,在c语言中用函数名这个符号来表示。
(4)结合函数的实质,函数指针其实就是一个普通变量,这个普通变量的类型是函数指针变量类,它的值就是某一个函数的地址(页就是它的函数这个符号在编译器中对应的值)
2.函数指针的书写和分析方法
(1)C语言本身是强类型语言(每一个变量都有自己的变量类型),编译器可以帮我们做严格的类型检查
(2)所有的指针变量类型其实本质都是一样的,但是为什么在c语言中要去区分他们,写法不一样呢(比如int类型指针就写int *p;数组指针就写int (*p)[5],函数指针就写的更复杂)
(3)假设我们有个函数是:
void func(void),
对应的函数指针;void (*p)(void)
类型是void (*)(void)
(4)函数名和数组名最大的区别就是:函数名做右值时加不加&效果和意义都是一样的;
pFunc = func1;//左边是一个函数指针变量,右边是一个函数名
pFunc = &func1;//&func1和func1做右值一模一样但是数组名做右值时加不加&意义就不一样。
void func1(void) {printf("test");
}void main(){void (*pFunc)(void);//变量名是:pFunc//类型是:void (*) (void)pFunc = func1;//左边是一个函数指针变量,右边是一个函数名pFunc = &func1;//&func1和func1做右值一模一样func1();//用函数指针来解调用函数
}
(5)写一个复杂的函数指针的实例:比如函数是strcpy函数
char *strcpy(char *dest, const char *src);
对应的函数指针是:char* (*pFunc)(char *dest,const char *src)
//直接使用函数指针调用strcpychar a[5] = { 0 };//char *strcpy(char *dest, const char *src);--->函数原型char* (*pFunc)(char*, const char*);//变量名为:pFuncpFunc = strcpy;pFunc(a, "abc");printf("a=%s\n", a);
3.typedef关键字的用法
(1)typedef是C语言中一个关键字,作用是用来定义(或者叫重命名类型)
(2)c语言中类型一共有2种:
第一种是编译器定义的原生类型(基础数据类型)
第二种是用户自定义类型,不是语言自带是程序员自己定义的
(3)typedef是将自定义类型进行重命名
(4)注意点:
typedef是给类型重命名,也就是说typedef加工出来都是类型,不是变量。
//这句话重命名了一种类型,这个新类型叫pType,类型是:char* (*)(char*, const char*)
typedef char* (*pType)(char*, const char*);//函数指针数组
typedef char* (*pType[1])(char*, const char*);void main(){char* (*p1)(char*, const char*);char* (*p2)(char*, const char*);pType p3;//等价于char* (*p3)(char*, const char*);pType p4;
}
三、函数指针实战
1.用函数指针调用执行函数
(1)最简单的函数指针来调用函数的示例上面已经讲解
(2)用函数指针指向不同的函数来实现同一个调用指向不同的结果
(3)比如C++和java等面向对象的语言,就会知道面向对象三大特征有一个多态。多态就是同一个指向实际结果不一样,跟我们这里看到的现象其实是一样的。
#include<stdio.h>
#include <string.h>//定义了一共类型pFun,这个函数指针类型指向一种特点参数列表和返回值的函数
typedef int (*pFun)(int, int);int add(int a, int b){return a + b;
}int sub(int a, int b) {return a - b;
}int multiply(int a, int b) {return a * b;
}int divide(int a, int b) {return a / b;
}void main(){pFun p1 = NULL;//函数指针char c = 0;printf("请输入操作数据类型:");scanf("%c", &c);switch (c) {case '+':p1 = add;break;case '-':p1 = sub;break;case '*':p1 = multiply;break;case '/':p1 = divide;break;default:p1 = NULL;break;}int a, b;printf("请输入2位数字");scanf("%d %d", &a, &b);int result = 0;result=p1(a, b);printf("a=%d,b=%d,c=%d", a, b, c);}
刚才调试可以得到很多信息:
(1)当程序出现段错误的时候,第一步先定位段错误。定位的方法就是在可疑加打印消息,从而锁定导致段错误的语句,然后集中分析这句话为什么会错误
(2)Linux中命令行默认是行缓冲的,意思是当我们程序printf输出的时候,LInux不会一个字一个字的输出我们的内容。而是将其缓冲起来放在缓冲区等一行准备完再一次性把一行全部输出(为了效率)。Linux判断一行有没有完的依据就是换行符'\n'
(window中换行符是\r\n
Linux中的换行符是\n
ios中的换行符是\r)
也就是说你printf再多,最后没有遇到\n(或者中断程序,或者缓冲区满)都不会输出而会不断缓冲,这时候你是看不到内容输出。因此,再每一个printf打印语句(尤其是用来做调试的printf)后面一定要加\n,否则可能导致几点:
(3)关于再linux命令行下用scanf写交互性代码的问题,想说以下几点:
1.我们用户再输入内容时结尾都会用\n结尾,但是程序中scanf的时候都不会去接收最后的\n,导致这个回车保存再标志输入中。下一次再scanf时就会被拿出来,就是导致你真正想拿的那个数反而没有机会拿,导致错误。
printf("请输入a=%d b=%d\n",a,b);
do{scanf("%c",&c);//将上面的换行符读取走
}while((c=='\n') || (c=='\r));
2.结构体内嵌函数指针实现分层
总结:
(1)本节和上节实际完成同一个任务,但是采用了不同的程序架构
(2)对于简单问题来说,上节的不分层反而容易理解,反而简单,本节的分层代码不好理解,看起来有点把简单问题复杂化。原因在于我们这个问题本身确实是简单问题,而简单问题应该简单处理。我们为什么还要这样做?
(3)分层之后上层为下层提供服务,上层写的代码是为了在下层中被调用
(4)上层注重注重业务逻辑,与我们最终的目标相直接关联,而没有具体干活的函数。
(5)下层注重实际干活的函数,注重为上层填充变量,并且将变量传递给上层中的函数(其实就是调用上层提供的接口函数)来完成任务。
cal.c
#include<stdio.h>
#include"framwork.h"int main(){int ret=0;struct cal_t myCal;myCal.a=12;myCal.b=3;myCal.p=div;ret=calculator(&myCal);printf("ret=%d",ret);return 0;
}
framwork.c
#include<framwork.h>int add(int a, int b){return a + b;
}int sub(int a, int b) {return a - b;
}int multiply(int a, int b) {return a * b;
}int divide(int a, int b) {return a / b;
}//计算器函数
int calculator(const struct cal_t *p){//这里我们使用的是结构体指针//表示将结构体中的值赋值给变量return p->p(p->a,p->b);
}
framwork.h
#ifndef __CAL_H__
#define __CAL__H__//定义了一共类型pFun,这个函数指针类型指向一种特点参数列表和返回值的函数
typedef int (*pFun)(int, int);//结构体是用来做计算器,计算器工作时需要的原材料
struct cal_t{int a;int b;pFunc p;
}//函数原型声明
void calculator(const struct cal_t *p);
四、在论typedef
1.c语言的2种类型:内建类型与用户自定义类型
(1)内建类型ADT,自定义类型UDT
2.typedef定义类型而不是变量
(1)类型是一个数据模块,变量是一个实在的数据。类型是不占内存,而变量是占内存的
(2)面向对象的语言中:类型就是类class,变量就是对象
3.typedef VS #define的区别
宏定义 (define) 和 typedef 的区别 | 编程指北
typedef 旧的 新的
#define 新的 旧的
typedef char *pChar;//表示将char*重命名为pChar
#define pChar char*;
4.typedef和结构体
(1)结构体在使用时都是先定义结构体,然后再使用结构体去定义变量
(2)C语言规定,结构体类型使用时必须使用 【struct 结构体类型名 结构体变量名;】这样来定义
//结构体类型的定义
struct student {char name[20];int age;
};//定义了一个结构体类型,这个类型有2个名字
//第一个名字:struct student
//第二个名字:student_t
typedef struct student {char name[20];int age;
}student_t;//两个名字一样也可以
//第一个名字:struct student
//第二个名字:student
typedef struct student {char name[20];int age;
}student;int main(){struct student s1;//struct stduent是类型,s1是变量s1.age = 12;student_t s2;student s3;//student s2;//不能这样定义一个结构体变量return 0;}
(3)使用typedef一次定义2个类型,分别是结构体变量类型和结构变量指针
结构体指针类型:struct teacher * pTeacher
//我们一次定义了两个类型
//第一个是结构体类型,有2个名字:struct teacher teacher
//第二个是结构体指针类型,有2个名字:struct teacher* pTeacher
typedef struct teacher {char name[23];int age;int mager;
}teacher,*pTeacher;teacher t1;t1.age = 23;pTeacher p1 = &t1;printf("teacher age=%d\n", p1->age);
5.typedef与const
(1)typedef int* PINT:永远只能修改变量的值,不能修改变量本身
(2)typedef const int *CPINT:可以修改变量本身,但是不能修改变量的值
1.typedef int* PINT;const PINT p2;相当于int *const p2;【不能修改p2的值】
typedef int* PINT;//将int * 重命名为PINT//注意区分
//const int *p和int *const p是不同的
//【const int *p】:表示p指向的变量是不可以变
//【int *const p】:表示p本身不可以改变int a = 23;int b = 11;PINT p1 = &a;//本来翻译过来是这样的:const int *p2 【指向的值不能改变】//但是测试说明:p2所指向的值是可以改变的const PINT p2= &a;*p2 = 33;printf("*p2=%d",* p2);p2 = &b;//此处报错,p2本身不能被修改
2.typedef int* PINT;cPINT const p2;相当于int *const p2;【不能修改p2的值】
typedef int* PINT;//将int * 重命名为PINT//注意区分
//const int *p和int *const p是不同的
//【const int *p】:表示p指向的变量是不可以变int a = 23;int b = 11;PINT p1 = &a;//本来翻译过来是这样的:const int *p2 【指向的值不能改变】//但是测试说明:p2所指向的值是可以改变的PINT const p2= &a;*p2 = 33;printf("*p2=%d",* p2);p2 = &b;//此处报错,p2本身不能被修改
如果确实想要得到const int *p【可以修改p本身】,这种效果,只能使用typedef const int *CPINT;CPINT p1;
//此时等价于
// int *cosnt p;【表示p本身不能改变】
typedef const int* CPINT;int a = 12;int b = 23;CPINT p = &a;*p = 22;//报错,此时不能修改p所指向的值p = &b;
6.使用typedef的意义
(1)简化类型的描述
char *(*)(char *,char *); typedef char *(*pFun)(char *,char *)
(2)很多编程体系下,人们倾向于不适应int,double等C语言内建类型,因为这些类型本身和平台是相关的(比如int再16位机器上是16位的,再32位机器上就是32位),所以很多程序使用自定义的中间类型再做缓冲。
用size_t来替代int
typedef int size_t;
(3)STM32库中全部使用了自定义类型
五、二重指针
1.二重指针与普通一重指针的区别
(1)从本质上来说,二重指针和一重指针本质都是指针变量,指针变量的本质就是变量
(2)一重指针变量和二重指针变量本身都占4字节内存空间
char** p1;//二重指针char* p2;//一重指针printf("sizeof(p1)=%d", sizeof(p1));//4printf("sizeof(p2)=%d", sizeof(p2));//4
2.二重指针的本质
(1)二重指针本质也是指针变量,和一重指针的差别就是他指向的变量类型必须是一个一重指针。二重指针其实也是一种数据类型,编译器再编译时会根据二重指针的数据类型来做静态类型检查,一旦发现允许是数据类型不匹配编译器就会报错。
(2)一重指针完全可以做二重指针做的事情。
3.二重指针的用法
(1)二重指针指向一重指针的地址
char** p1;//二重指针char* p2;//一重指针p1 = &p2;//p2本身是char *类型的,再取地址变成 char **类型的和p相同
(2)二重指针指向指针数组
int* p1[2];int* p2;int** p3;//p1 = p2;//报错//p1是指针数组名,本质是数组名,数组名做右值表示数值首元素首地址//数组的元素就是int*类型,所以p1做右值就表示一个int *类型//变量的地址,所以p1就是一个int类型的变量的指针//所以他指向一个二重指针int **;p3 = p1;
(1)实践编程中二重指针用的比较少,大部分时候就是和指针数组纠结起来。
(2)实际编程中有时候在函数传参时为了通过函数内部改变外部的一个指针变量,会传这个指针变量的地址(也就是二重指针)进去。
void func(int** p) {*p = (int*)0x123456;
}int main(){int a = 4;int* p = &a;//此时p指向aprintf("p=%p\n", p);func(&p);//此时在func内部将p指向了其他地方printf("p=%p\n", p);*p = 23;//此时p指向0x123456,但是这个地址是不允许访问的,所以出现段错误}
4.二重指针与数组指针
(1)二重指针,数组指针,结构体指针,一重指针,普通变量的本质都是相同的,都是变量
(2)所有的指针变量的本质都是相同的,都是4字节。都是用来指向别的东西的,不同类型的指针变量只是可以指向的(编译器允许你指向的)变量类型不同。
(3)二重指针就是:指针数组指针
六、二维数组
1.二维数组的内映像
(1)一维数组在内存中的连续分布的多个内存单元组成的,而二维数组在内存中也是连续分布的多个内存单元组成的
(2)从内存角度来看,一维数组和二维数组没有本质区别
2.二维数组的维数
3.二维数组的下标式访问和指针式访问
4.二维数组的应用和更多维数组
七、二维数组的运算和指针
1.指针指向二维数组的数组名
(1)二维数组的数组名表示二维数组的第一位数组中首元素(也就是第二维的数组)的首地址
(2)二维数组的数组名a等同于&a[0],这个和一维数组的符号含义是相符的
(3)用数组指针来指向二维数组的数组名类型是匹配的
int a[2][3] = { {1,2,3},{4,5,6} };//int* p1 = a;//报错---类型不匹配//int** p2 = a;//报错---类型不匹配int(*p3)[3] ;//类型匹配p3 = a; //数组指针,指针指向一个数组,数组有2个int类型元素//a是二维数组的数组名,作为右值表示二维数组第一维的数组//的首先元素的首地址,等同于&a[0]printf("a[0][1]=%d\n", *(*(p3 + 0) + 1));printf("a[1][1]=%d\n", *(*(p3 + 1) + 1));
2.指针指向二维数组的第一维
(1)用int *p来指向二位数组的第一维a[i]
//指针指向二维数组的第一维int a[2][5] = { {1,2,3,8,9},{4,5,6,10,11} };//&a[0]:表示第一维的地址//int* p4 = &a[0];//报错int* p4 = a[0];//a[0]表示二维数组的第一维的第一个元素,相当于是//第二维的整体数组的数组名。数组名又表示数组元素//首地址,因此a[0]等同于&a[0][0]//等价于int* p5 = &a[0][0];printf("a[0][4]=%d", *(p5 + 4));//a[1]等价于&a[1][0]int* p6 = a[1];//此时指向第一维的第二个元素printf("a[1][3]=%d", *(p6 + 3));
3.指针指向二维数组的第二维
(1)二维数组的第二维元素其实就是普通变量了(a[1][1]其实就是int类型的7),已经不能用指针类型和它相互赋值
(2)除非int *p=&a[i][j],类似于指针指向二维数组的第一维
相关文章:
C语言复杂表达式与指针高级
一、指针数组与数组指针 1.指针数组VS数组指针 (1)指针数组:实质是一个数组,因为这个数组中传参的内容全部是指针变量。 (2)数组指针:实质是一个指针,这个指针指向一个数组 2.分析指…...
【Python从入门到进阶】39、使用Selenium自动验证滑块登录
接上篇《38、selenium关于Chrome handless的基本使用》 上一篇我们介绍了selenium中有关Chrome的无头版浏览器Chrome Handless的使用。本篇我们使用selenium做一些常见的复杂验证功能,首先我们来讲解如何进行滑块自动验证的操作。 一、测试用例介绍 我们要通过sel…...
利用FPGA和CPLD数字逻辑实现模数转换器
数字系统的嵌入式工程师熟悉如何通过使用FPGA和CPLD在其印刷电路板上将各种处理器,存储器和标准功能组件粘合在一起来实现其数字设计的“剩余”。除了这些数字功能之外,FPGA和CPLD还可以使用LVDS输入,简单的电阻电容器(RC…...
上海亚商投顾:沪指震荡调整跌 减肥药、华为概念股持续活跃
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 沪指上个交易日低开后震荡调整,深成指、创业板指盘中跌超1%,宁德时代一度跌超3%ÿ…...
间歇性微服务问题...
在Kubernetes环境中,最近由于特定配置导致Pod调度失败。哪种 Kubernetes 资源类型(通常与节点约束相关)可能导致此故障,尤其是在未正确定义的情况下? 节点选择器资源配额优先级污点Pod 中断预算 已有 201 人回答了该…...
小程序开发平台源码系统+ 带前后端完整搭建教程
大家好,给大家分享一个小程序开发平台源码系统。这款小程序开发平台中有很多功能,今天主要来给大家介绍一下洗车行业小程序制作的功能。以下是部分核心代码图: 系统特色功能: LBS定位:小程序能够自动显示附近的共享洗…...
外部统一设置了::-webkit-scrollbar { display: none; }如何单独给特定元素开启滚动条设置样式-web页面滚动条样式设置
如果你在外部统一设置了::-webkit-scrollbar { display: none; }来隐藏滚动条,但是想要在.lever元素中单独开启滚动条的样式,你可以使用CSS的级联选择器来覆盖外部样式。 以下是一个示例,展示如何给.lever单独开启…...
【计算机网络】网络原理
目录 1.网络的发展 2.协议 3.OSI七层网络模型 4.TCP/IP五层网络模型及作用 5.经典面试题 6.封装和分用 发送方(封装) 接收方(分用) 1.网络的发展 路由器:路由指的是最佳路径的选择。一般家用的是5个网口,1个WAN口4个LAN口(口:端口)。可…...
力扣第39题 组合总和 c++ 回溯剪枝题
题目 39. 组合总和 中等 相关标签 数组 回溯 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 cand…...
qt软件正常运行的崩溃了定位行号方法
软件(debug版exe或者release版exe)在正常运行状态下(不是gdb调试运行),如果软件崩掉,那么会直接闪退,软件什么也做不了,此时无法保存软件中的状态信息,此外,也…...
软件工程与计算总结(十五)详细设计中面向对象方法下的信息隐藏
软件工程与计算总结(十三)详细设计中的模块化与信息隐藏 之前的博客中,模块需要隐藏的决策主要由“职责的实现”and“实现的变更”两类,在面向对象方法中,需要做到的就是: 封装类的职责,隐藏职…...
鸿蒙初体验
下载与安装DevEco Studio 在HarmonyOS应用开发学习之前,需要进行一些准备工作,首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网,单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…...
hive复合类型的数据查询
hive数据表创建-CSDN博客 --第一个名字以M开头的 访问数组array 数组( array) 引用方式 列名 [ 元素索引 _ 以 0 开始 ] select * from emp where emp_name[0] rlike "^M"; -- 出生日期是在 5 几年 访问 Map map 引用方式 列名 ["Key"] selec…...
Notes/Domino 14 Early Access Drop3发布
大家好,才是真的好。 其实上周,就是国庆假期的时候,HCL Notes/Domino 14 Early Access Drop3(以下简称EA3)就已经发布,而且和传说中的一样,带来了数项惊人的新特性。 我们先讲讲这一版本新特性…...
前端、后端开发者常用到的免费API整理
以下是我整理的前端、后端工程师在开发中经常使用到的API接口,希望能帮到大家~ 手机号码归属地:可根据手机号码查询其省市区、运营商区号行政区划代码等信息。 上亿条数据囊括最新的170、166、147等号段,更新及时、准确度高。空号检测&#…...
【LeetCode高频SQL50题-基础版】打卡第9天:第46~50题
文章目录 【LeetCode高频SQL50题-基础版】打卡第9天:第46~50题⛅前言患某种疾病的患者🔒题目🔑题解 第二高的薪水🔒题目🔑题解 按日期分组销售产品🔒题目🔑题解 列出指定时间段内所有的下单产品…...
中断机制-通过volatile实现线程中断停止
4.1.4 大厂面试题中断机制考点 如何停止中断运行中的线程? 通过一个volatile变量实现 package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit;/*** author zhou* version 1.0* date 2023/10/15 2:34 下午*/ public class InterruptD…...
Elasticsearch 8.11 中的合并更少,摄取更快
作者:ADRIEN GRAND Elasticsearch 8.11 改进了管理索引缓存的方式,从而减少了段合并。 我们对 Elasticsearch 8.11 从索引缓存回收内存的方式进行了重大更改,这有助于减少合并开销,从而加快索引速度。 使用我们的日志跟踪&#x…...
算法村开篇
大家好我是苏麟从今天开始我将带来算法的一些习题和心得体会等等...... 算法村介绍 我们一步步地学习算法本专栏会以闯关的方式来学习算法 循序渐进地系统的学习算法并掌握大部分面试知识 , 期待和大家一起进步 . 索大祝大家学有所成 , 前程似锦....
Leetcode—136.只出现一次的数字【简单】
2023每日刷题(二) Leetcode—136.只出现一次的数字 位运算法 实现代码 int singleNumber(int* nums, int numsSize){int i 0;int res 0;for(; i < numsSize; i) {res ^ nums[i];}return res; }运行结果 之后我会持续更新,如果喜欢我的…...
关于RNNoise、webrtc_ns、三角带通滤波器、对数能量
语音特征参数MFCC提取过程详解 其中讲解了:三角带通滤波器 、计算每个滤波器组输出的对数能量、对数能量、经离散余弦变换(DCT)得到MFCC系数 推荐阅读某乎这位大佬的全部文章: 下面是几篇出自这位大佬的很好的文章: …...
c语言练习89:链表的使用
链表的使用 虽然有这么多的链表的结构,但是我们实际中最常⽤还是两种结构: 单链表 和 双向带头循环链表 1. ⽆头单向⾮循环链表:结构简单,⼀般不会单独⽤来存数据。实际中更多是作为其他数据结 构的⼦结构,如哈希桶、…...
ArkTS及openHarmony
补充 padding:内边距,也就是盒子边和盒子内部的距离 margin:外边距,也就是盒子和盒子的距离 openHarmony应用开发及UI界面 常用布局 Row 水平线性布局核心代码 子控件会共享同一行,也就是都在同一行内 Preview C…...
Idea怎么配置Maven才能优先从本地仓库获取依赖
网上的方法 : 在设置中搜索 Runner ,在VM Option中设置参数 -DarchetypeCataloginternal删除 解压后的依赖包中的 _remote.repositories m2e-lastUpdated.properties *.lastUpdated 文件。 上边都没有效果 最终的解决方法,修改maven配置文件settings.xml 主要两个…...
聊聊HttpClient的DnsResolver
序 本文主要研究一下HttpClient的DnsResolver DnsResolver org/apache/http/conn/DnsResolver.java /*** Users may implement this interface to override the normal DNS lookup offered* by the OS.** since 4.2*/ public interface DnsResolver {/*** Returns the IP a…...
剑指智能驾驶,智己LS6胜算几何?
监制 | 何玺 排版 | 叶媛 10月12日,IM智己旗下的新车智己LS6宣布上市。 新车型搭载尖端科技多项,其中以“全画幅数字驾舱屏”、和城市高阶智能辅助驾驶为核心的智驾技术,更是引来众多用户关注。 01 新能源新卷王智己LS6 智己LS6一发布就…...
网络工程师知识点5
71、什么是FTP? FTP是文件传输协议。 FTP传输数据时支持两种传输模式:ASCII模式和二进制模式。 需要TCP的21号端口来建立控制连接 需要TCP的20号端口来建立数据连接 72、什么是telnet? Telnet提供了一个交互式操作界面,允许终端远…...
未来展望:大型语言模型与 SQL 数据库集成的前景与挑战
一、前言 随着 GPT-3、PaLM 和 Anthropic 的 Claude 等大型语言模型 (LLM) 的出现引发了自然语言在人工智能领域的一场革命。这些模型可以理解复杂的语言、推理概念并生成连贯的文本。这使得各种应用程序都能够使用对话界面。然而,绝大多数企业数据都存储在结构化 …...
SpringCloud-Hystrix
一、介绍 (1)避免单个服务出现故障导致整个应用崩溃。 (2)服务降级:服务超时、服务异常、服务宕机时,执行定义好的方法。(做别的) (3)服务熔断:达…...
Ansible脚本进阶---playbook
目录 一、playbooks的组成 二、案例 2.1 在webservers主机组中执行一系列任务,包括禁用SELinux、停止防火墙服务、安装httpd软件包、复制配置文件和启动httpd服务。 2.2 在名为dbservers的主机组中创建一个用户组(mysql)和一个用户&#x…...
医院的 建设网站的策划书/全网网络营销
我们都知道一个iOS应用的如果是在main函数中,它的实现是 int main(int argc, char * argv[]) {autoreleasepool {return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));} } 复制代码我们看到在main中有个autoreleasepool,那它到底是什么呢?让我…...
如何解析到凡科建设的网站/国际新闻快报
// -------------------- UISlider (滑块控件 是一个滑杆 存放着一系列的值) // UISlider *slider [[UISlider alloc]initWithFrame:CGRectMake(30, 100, 300, 30)]; // 设置滑块的显示图片 [slider setThumbImage:[UIImage imageNamed:"1.png"] forSta…...
12380网站的建设情况/电商关键词查询工具
在原生中事件调用就需要加上on,例如:onmouseenter,onclick, 但是由于jquery自己封装了,不属于原生,所以我们在调用事件的时候不会用到on $(document).ready(function(){ $(".parent").mouseenter(function(){ $(".…...
桂林创新大厦网站/网络推广的网站有哪些
受工作性质所影响 最近对DataBase蛮有兴趣 之前只是对SQL Server小有接触 一直只能仰望Oracle和DB2 最近突然想对他们动起了念头 因为网速原因 DB2暂时还未下载到 所以就只好先对Oracle 10g下手了 安装过程倒是挺顺利 对于第一次接触Oracle的我来说 安装成功后 真是点不知所措 …...
贵州建设监理协会网站/百度知识营销
资源下载地址:https://download.csdn.net/download/sheziqiong/85709349 资源下载地址:https://download.csdn.net/download/sheziqiong/85709349 目 录 1 绪论 1 1.1系统开发的背景 1 1.2系统开发的意义 1 2 系统分析 1 2.1需求分析 1 2.2 可行性分析 …...
plc编程培训机构/搜索引擎优化培训
PS: 1.form2是主窗体,form1是子窗体,我当时安装的是XE8,新建第一个窗体就是叫form2。 2.事件处理用到了控件(ApplicationEvents1)。 3.源代码下载地址:“https://download.csdn.net/download/zhujianqiangq…...