技术标签: c语言
若是晴日的午后,阳光透过院子照进宅子,在磨白的梳妆台上留下斑驳的印记。
上帝借由各种途径让让我们变得孤独,好让我们走向自己
我有那么多奇妙能力,却没有你
int a;
a=10;
int b; //错误,因为变量定义int放在了执行部分,应该放在a=10;前面
b=a+20;
printf()返回的是它输出的内容的长度
如 int n=printf(“abc”); 则控制台输出abc,n的值为3
scanf()返回的是它接收的数据的个数
如 int n=scanf("%d%d",&a,&b);则在输入值之后,n的值为2
%d:有符号,整形
%u:无符号,整形
%f:float
%c:字符型,char
%s:字符串
printf():
%4d表示输出至少占4格,不够(数位<4)则补空格,够(>=4)则输出实际数位
%5.3d表示至少要输出3位数,当数据长度小于3时左边补0
%5.3f表示输出3位小数
%.3s表示指数从字符串的前3个字符
scanf():
%4d表示输入至多占4格,如果输入的是5为数,则从高到低取4位。如,如果输入的123567,则实际上内存中的数据为1235
printf()中,如果需要输出%,必须在格式字符串中用%%代替单个%
%%与转义字符无关,它与printf如何处理格式说明符有关,转义字符对所有字符串有效,并在编译时完成,格式说明符(%)仅在一些函数使用,并在运行时使用。简而言之,在字符串或单个字符中,%都能代表它本身,不需要也不能用%%来表示一个%,只在像printf这样使用%作为格式说明符的函数中规定使用%%来明确表示一个%字符
puts()函数遇到’\0’就停止输出,如果字符数组中存储有’\0’,则即使后面还有字符也不会输出
getchar()的返回值是所键入字符的ASCII
putchar()的返回值是所返回字符的ASCII,出错则返回EOF(-1)
逗号表达式的优先级最低,从前往后执行,最后一个表达式的值就是整个逗号表达式的值
如return (a,b);则返回b
sizeof() 获取变量和数据类型所占内存大小(字节数)
char c[]=“abc” sizeof的值为4
优先级:强制类型转换>算术运算符>赋值运算符
float(1/2)的结果为0,因为先算括号里面的
#define定义的值就直接将其替换到表达式的位置,不会先计算
#define N 4+4
printf("%d",3*N*2+1);
输出21,因为计算的时候是3*4+4*2+1
一维数组的初始化: 数据类型符 数组变量名[ 常量表达式 ]={表达式1,表达式2,表达式3}
定义数组时,如果没有为数组变量赋初值,那么就不能省略数组的大小。而且数组不初始化,其数组元素的值为随机值
除了在定义数组变量时用初值列表对数组整体赋值以外,无法再对数组变量进行整体赋值
一维数组与二维数组在初始化时如果没有赋初值则自动补0
二维数组在内存中是以一列形式存储的
二维数组的初始化:数据类型 数组变量名[ 行常量表达式 ] [ 列常量表达式 ]={ {第0行初值表},{第1行初值表},…,{最后一行初值表}}
二维数组的初始化:
1.将初值放在一对{}中,与一维相同:int a[2][3]={1,2,3,4,5,6};
2.按行初始化,每一行初值均采用一对{ }括起来:int a[2][3]={
{1,2,3},{4,5,6}};
3.定义二维数组的同时给数组初始化,则可以省略行数,但列数不能省略
字符数组的定义:
char str[] ="china";
char str[]={
'c','h','i','n','a','\0'}; //这样定义的话必须以'\0'结尾
char str[]={
"china"};
定义时,如果指定了数组的大小,则未指定的单元值为0
字符串常量只能在定义字符数组时赋初值给字符数组变量
在数字符数组的长度的时候,末尾的‘\0’也要被计算上
字符串的输入: gets(字符数组变量名) 遇回车返回,空格不返回
字符串的输出: puts(字符串地址) 遇到’\0’结束输出,’\0’变成换行
字符串的长度: strlen(字符串地址) 从给定地址开始到第一个’\0’结束,’\0’ 不包含在长度中
字符串的复制: strcpy(字符数组1,字符数组2) 或者 strncpy(字符数组1,字符串2,长度n) 把2(前n个字符)复制给1
字符串的比较: strcmp(字符串1,字符串2) 逐个比较ASCII,1>2则返回正整数,1<2则返回负整数,1=2返回0
字符串数组: 构成数组的数据是字符串
字符串数组的初始化:char 字符串数组名[ 行数m ] [ 列数n ]={字符串1,字符串2,…,字符串m}
每个字符串的长度应小于过等于n-1,因为字符串的结尾符’\0’占用一个单元
char city[] [10] ={“beijing”,“Shanghai”,“wuhan”};
city[0] --------> ‘b’ ‘e’ ‘i’ ‘j’ ‘i’ ‘n’ ‘g’ ‘\0’ 0
city[1] --------> ‘s’ ‘h’ ‘a’ ‘n’ ‘g’ ‘h’ ‘a’ ‘i’ ‘\0’
city[2] ---------> ‘w’ ‘u’ ‘h’ ‘a’ ‘n’ ‘\0’ 0 0 0
多余空位补0
定义数组时,如果为数组变量赋了初值,可以省略数组的大小,但是如果没有赋初值,则不能省略数组的大小
初值至少要有一个值
数组名仅仅是数组在内存中的地址,本身不代表数组单元的全部
数组名是地址不可以被赋值也不可以++或–
数组作为函数参数和返回值的时候,都用的是数组名
数组名做实参时,它和对应形参直接是地址传递
向字符数组赋值的时候:
c[10]={“1”,“1”} //像普通数组这样赋值
*c=“book”; //用指针赋值
strlen() 求的是字符串的长度,字符串长度到\0就结束了,即使字符数组后面还有元素,也不会被计算(此处联系一下put()函数)
如果在定义函数时省略返回值类型符,则默认为int型
值传递:函数调用时,为形参分配内存单元,并将实参的值复制到形参中,调用结束后,形参所占的内存单元被释放,实参的内存单元保留并维持原值。(单向传递)
地址传递:在函数调用时,实参数据的存储地址作为参数传递给形参。此时,形参与实参占用同样的内存单元,函数中对形参值的改变也会改变实参(双向数据传递)
地址传递时,实参或形参必须是地址常量或地址变量(形参和实参指向同一个内存单元)
函数名和函数调用不同,函数名是一个地址,不能传参数,函数调用可以传参数,函数的返回值给的是函数调用而不是函数名
int max(int x,int y){
//省略}
main()
{
//函数名是max
max(1,2);//这是一个函数调用,返回值给的是max()而不是函数名max
}
int fun(int *p)
return *p;
*号:
1.双目运算符就是乘法
2.前有类型,后有分号说明是类型定义,*是一个标志
3.指针运算:地址变量前有*说明为内容值,不是读就是写,放在赋值号左边是写,其它情况都是读
int a;
int *pi=&a;
char *pc;
pi=(char *)pi;//强制类型转换
p+i 与 a+i 与 &a[i] 等价
*(p+i) 与 *(a+i) 与 a[i] 与 p[i] 等价
p++ ; ++p ; p+=1 ; p=p+1
p-- ; --p ;p-=1 ; p=p-1*p++ *(p++) 先取出地址值再移动指针
*++p *(++p) 先移动指针在取出值
(*p)++ ++(*p) ++*p p所指的内容值加1
(*p)-- --(*p) --*p p所指的内容值减1
int b[5]={
10,30,20,15,40};
int *q-b+2
初始:q指向20(如下操作独立,不是顺序执行)
*q++:表达式值为20,q指向b[3]
*++q: 表达式值为15,q指向b[3]
(*q)++:表达式值为20,q指向b[2](先输出再加)
++(*q):表达式值为21,q指向b[2](先加再输出)
行 ————————>列(元素)——————>元素
二维——[]或*—— 一维——[]或*
int a[3] [4];
int *p=&a[0] [3];
p+1指向元素a[1][0]
p+4指向元素a[1][3]
p-2指向元素a[0][1]
对于普通的列指针变量定义就是int *p;(元素指针变量,普通指针变量)
定义行指针变量:类型 (*指针变量名) [m];
其中m是整数且为数组列数
int a[5][7];
int (*p)[7];//行指针变量
int *q=&a[2][2];//列指针变量
int *s=a;//不合法!因为a是行地址,而s 是普通的元素指针(列地址),不是行指针
char str[]=“China”;合法,且数组长度为6(还有末尾的’\0’)
char *p=“China”;合法,字符串是地址,地址常量赋给地址变量,合法
str=“Chinese”;不合法!str是数组名,数组名是地址常量,不可以放在赋值号左边
p=“Chinese”;合法
char *p={“China”};不合法,p是字符型指针变量,指针变量应得地址,字符串的标志是一对双引号而不是一对花括号,所以加上花括号一定不正确,花括号是初始化的事
char str[]={“China”};合法,字符数组在赋值的同时初始化
char *p;*p=“China”;不合法,有*为内容值,不是读就是写,放在赋值号的左边是写,而右侧字符串是一个地址
char s[20]="abcedefGHI";
char *p="1234567";
//将指针后移5个元素,然后从该元素开始输出,遇到'\0'结束输出,输出的是一串字符
printf("%s\n",s+2);//初始指向a,后移2个元素,输出cdefGHI
printf("%s\n",p+5);//初始指向a,后移5个元素,输出67
printf("%s\n",strcat(s+3,p+4));//字符串连接,输出edefGHI567
printf("%s\n",strlen(p+2));//计算有效字符的长度,不包括'\0',从所给地址指向的字符开始到\0结束
printf("%s\n",strcpy(p+3,s+9));//字符串拷贝,从p+3的位置开始输出
printf("%s\n",s);//从第一个字符开始将全部输出
scanf("%s",s+3);//scanf中的地址表列,内容变量加&,数组中的元素要加&,如果本身是一个地址就不用加&了,输入时遇到" "(空格)或回车都能停止接收,如果想要接收含有空格的字符串要用gets()
printf("%s\n",s);
int max(int a,int b){
//省略 }
main()
{
int x=1,y=2
int (*p)();//定义指向函数的指针变量
p=max;
max(x,y);//函数调用
p(x,y);//也可以写成(*p)(x,y);
}
int *fun(int *x,int*y)//int * 一定要加return 地址
{
if(*x<*y)
return x;//有*为内容值,无*为地址
else
return y;
}
main()
{
int a=7,b=8,*p,*q,*r;
p=&a;//内容变量画房子,地址变量画指向,得谁地址指向谁
q=&b;
//函数调用一定要赋值给一个地址变量
r=fun(p,q);//有*为内容值,无*为地址,
printf("%d,%d,%d\n",*p,*q,*r);//有*为内容值,不是读就是写,放在赋值号前是写,其他是读
}
#define XYZ "this is a test"
printf("XYZ") //输出XYZ
结构体成员变量成员的访问:
非指针类型:结构体变量名.成员名
指针类型:结构体指针->成员名 或 (*结构体指针).成员名
常用文件函数
定义文件指针 | FILE *指针名 |
---|---|
打开文件 | fopen(文件名,打开方式) |
关闭文件 | fclose(文件指针名) |
将文件标志指向开头 | rewind(文件指针名) |
移动文件指针位置 | fseek(文件指针,位移量,起始点) |
起始点 | 文件开始位置:SEEK-SET ,0;文件当前位置:SEEK-CUR,1;文件末尾位置:SEEK-END,2 |
测定文件位置标记的当前位置 | ftell(文件指针名) |
判断是否到达文件尾部(为真则到达) | feof(文件指针名) |
从文件中读 | 向文件中写 |
---|---|
fgetc(文件指针名) | fputc(字符,文件指针) |
fgets(字符串,文件个数,文件指针) | fputs(字符串,文件指针) |
fscanf(文件指针,格式字符串,输入表列) | fprintf(文件指针,格式字符串,输入表列) |
fread(读取到的数据存放在程序中的变量的地址,读取的字节个数,读取的数据项个数,文件指针) | fwrite(程序中存放数据的变量的地址,写入的字节个数,写入的数据项个数,文件指针) |
打开文件的方式:
r:打开已经存在的文件,只读
r+:打开已经存在的文件,可读可写
w:创建新文件并写数据,如果文件存在则覆盖写
w+:创建新文件并读写,文件存在则覆盖写
a:打开已存在的数据并追加写,文件不存在则创建
a+:同a,且可读
t:打开文本文件
b:打开二进制文件
在对文件进行读取的时候,若先执行了一次读取但是并没有读取到文件末尾,则下次读取的时候就会从上次读取结束的地方继续向下读取,而不是从头开始
文件指针在读取一次之后会自动后移
比如文件中的内容是abcdefg,读取完a之后,文件指针会自动指向b,下次从b开始读,读完自动指向c
sizeof()是一个二级单目运算符,用于求出一个变量或者一个类型在内存中占的字节数(字符串要算’\0’)
此处注意,指针变量永远占2字节
double a; sizeof(a);为8
double *b; sizeof(b);为2
double c[5]; sizeof( c );为40
double *pt[3]; sizeof(pt);为6
待更新...
一、闭包定义在其他函数内部的函数作用:1、可以读取函数内部的变量;2、让这些变量的值始终保持在内存中二、promise作用:解决异步问题、回调地狱问题缺点:执行不可取消axios取消请求promise.all:必须全部成功promise.race:只需要一个成功catch可以作为then的第二个参数三、vue响应式四、vue中watch五、vue中computed计算属性vue-router中hash和history模式hash:history:vue-router路由守
177. 第N高的薪水作者:luanhz链接:https://leetcode-cn.com/problems/nth-highest-salary/solution/mysql-zi-ding-yi-bian-liang-by-luanz/来源:力扣(LeetCode)难度中等编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。+----+--------+| Id | Salary |+----+--------+| 1 | 100 || 2
绿色计算是高性能计算在节能降耗方面向传统计算中心模式提出的新挑战,是高性能计算产业发展的趋势。回顾高性能计算的发展历程,从大型机、并行机到今天的大规模PC集群以及热门的云计算,专用机房、供配电、制冷等技术也随之不断地变化,各个厂...
较旧的Servlet容器不支持Servlet 3.0中使用的ServletContextInitializer引导过程.您仍然可以在这些容器中使用Spring和Spring Boot,但是您需要在应用程序中添加web.xml并将其配置为通过DispatcherServlet加载ApplicationContext.为了创建可部署的war文件,是提供一个SpringBootServletInitia...
有时设置的规则可以套用多个板子,或者是设置一个原始规则进行规则复位。这种时候需要用到规则的导入与导出。(1)在PCB规则及约束编辑器中单击鼠标右键,选择Export Rules…选项。(2)在弹出的窗口中选择需要导出的规则项。(3)在另外一块PCB上,进入PCB规则及约束编辑器,选择Import Rules选项。...
JDK下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html点击链接进入找到JDK8点击图中箭头所指按钮进入后出现下面界面点击Accept License Agreement 按钮然后选择自己电脑系统对应的版本进行选择下载安装JDK安装过程和普通软件安装没什么区别,过程中会让你选择JDK和JRE安...
这个主板支持intel775针的处理器主要有:处理器型号 架构 高速缓存 时钟速度 前端总线E8600 45 纳米 6MB 二级缓存 3.33 GHz 1333 MHzE8500 45 纳米 6MB 二级缓存 3.16 GHz 1333 MHzE8400 45 纳米 6MB 二级缓存 3 GHz 1333 MHzE8300 45 纳米 6MB 二级缓存 2.83 GHz 1333 MHzE8200...
这里写自定义目录标题删掉由于前面表格引起的word最后一页空白删掉由于前面表格引起的word最后一页空白Ctrl+backspace或者Alt+backspace
# -*- coding: utf-8 -*-"""Created on Wed May 31 14:07:54 [email protected]: ESRI"""import json import sysif __name__ == "__main__": reload(sys) sys.setdefaultencoding( "ut
我有一个形式(它们具有相同的“名称”属性)分组一些单选按钮和我想补充盒/不同颜色的边框围绕them.Something这样的:CSS:如何添加不同颜色的边框来输入单选按钮标签?例子: 对CSS按钮的代码:.form ul {list-style: none;height: 100%;width: 100%;margin: auto;padding: 0;}ul li {color: #4169E1...
这个号称要引领区块链进入大消费时代的Potato Wallet,突然进入了大众视野。2020年2月4日POTATO官方发布消息:Potato Wallet测试版本于2020年2月4日当天上线,并声称POTATO从此拥有了自己的数字钱包,将不再使用第三方钱包支付。貌似听上去是一次里程碑式的成就,但小编发现Potato Wallet的logo似曾相识...2019年4月24日,有着分布式存储先驱之称的...
MySQL有时候忘记了root密码是一件伤感的事,下面通过本文给大家介绍Mysql忘记root密码怎么办的相关知识,需要的朋友参考下MySQL有时候忘记了root密码是一件伤感的事,这种情况下,如何重置root的密码呢?找到并编辑mysql的my.ini配置文件,在mysqld节点中添加上skip-grant-table. 如下:# These let you safely reset the l...