c的那些事_c的事-程序员宅基地

技术标签: c语言  心的  

1.在传递时时刻记得传递参数的类型保持一致
2.在保存字符串时可以用char a[10],保存,在输出时,只需要printf("%s",a)就可以输出字符串,不可以写成printf("%s",a[10]).
3.以前曾介绍过对内存中信息的存取一般以字节为单位。实际上,有时存储一个信息不必用一个或多个字节,例如,“真”或“假”用0或1表示,只需1位即可。在计算机用于过程控制、参数检测或数据通信领域时,控制信息往往只占一个字节中的一个或几个二进位,常常在一个字节中放几个信息。那么,怎样向一个字节中的一个或几个二进位赋值和改变它的值呢?
C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域” ( bit field) 。利用位段能够用较少 的位数存储数据。例如:  struct packed-data   {unsigned a:2;unsigned b:6;unsigned c:4;unsigned d:4;int i;}data;其中a、b、c、d分别占2位、6位、4位、4位。i为整型。共占4个字节。 也可以使各个位段不恰好占满一个字节。如:    struct packed-data     {unsigned a:2;unsigned b:3;unsigned c:4;int i;};struct packed-data data;其中a、b、c共占9位,占1个字节多,不到2个字节。它的后面为int型,占2个字节。在a、b、c之后7位空间闲置不用,i从另一字节开头起存放。 注意,在存储单元中位段的空间分配方向,因机器而异。在微机使用的C系统中,一般是由右到左进行分配的。但用户可以不必过问这种细节。对位段中的数据引用的方法。如:data.a=2;data.b=7;data.c=9;注意位段允许的最大值范围。如果写data.a=8;就错了。因为data.a只占2位,最大值为3。在此情况下,自动取赋予它的数的低位。例如,8的二进制数形式为1000,而data.a只有2位,取1000的低2位,故data.a得值0。
关于位段的定义和引用,有几点要说明:(1) 位段成员的类型必须指定为unsigned或int类型。(2) 若某一位段要从另一个字开始存放。可以用以下形式定义:unsigned a:1; unsigned b:2; (一个存储单元)
unsigned:0; unsigned c:3;  (另一存储单元) 
本来a、b、c应连续存放在一个存储单元(字)中,由于用了长度为0的位段,其作用是使下一个位段从下一个存储单元开始存放。因此,现在只将a、b存储在一个存储单元中,c另存放在下一个单元。(上述“存储单元”可能是一个字节,可能是29字节,视不同的编译系统而异。)(3) 一个位段必须存储在同一存储单元中,不能跨两个单元。如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。(4) 可以定义无名字段。如:unsigned a:1; unsigned :2;(这两位空间不用) unsigned b:3; unsigned c:4;在a后面的是无名位段,该空间不用。(5) 位段的长度不能大于存储单元的长度,也不能定义位段数组。(6) 位段可以用整型格式符输出。如:printf("%d,%d,%d",data.a,data.b,data.c); 当然,也可以用%u、%o、%x等格式符输出。(7) 位段可以在数值表达式中引用,它会被系统自动地转换成整型数。如:data.a+5/data.b是合法的。 #c++ 
4.在#line中  输出行号是__LINE__记住是两个_.
5.C语言重命名文件,删除文件,复制文件函数名: rename 功 能: 重命名文件 用 法: int rename(char *oldname, char *newname); 程序例: #include <stdio.h> int main(void) { char oldname[80], newname[80]; /* prompt for file to rename and new name */ printf("File to rename: "); gets(oldname); printf("New name: "); gets(newname); /* Rename the file */ if (rename(oldname, newname) == 0) printf("Renamed %s to %s.\n", oldname, newname); else perror("rename"); return 0; } --------------------------------------------------------函数名: remove 功 能: 删除一个文件 用 法: int remove(char *filename); 程序例: #include <stdio.h> int main(void) { char file[80]; /* prompt for file name to delete */ printf("File to delete: "); gets(file); /* delete the file */ if (remove(file) == 0) printf("Removed %s.\n",file); else perror("remove"); return 0; } --------------------------------------------------------拷贝的话, 要么字节写一个函数; 或者使用 win API: CopyFile --------------------------------------------------------/* Chapter 1. Basic cp file copy program. C library Implementation. */ /* cp file1 file2: Copy file1 to file2. */ #include <windows.h> #include <stdio.h> #include <errno.h> #define BUF_SIZE 256 int main (int argc, char *argv []) { FILE *in_file, *out_file; char rec [BUF_SIZE]; size_t bytes_in, bytes_out; if (argc != 3) { printf ("Usage: cp file1 file2\n"); return 1; } in_file = fopen (argv [1], "rb"); if (in_file == NULL) { perror (argv [1]); return 2; } out_file = fopen (argv [2], "wb"); if (out_file == NULL) { perror (argv [2]); return 3; } /* Process the input file a record at a time. */ while ((bytes_in = fread (rec, 1, BUF_SIZE, in_file)) > 0) { bytes_out = fwrite (rec, 1, bytes_in, out_file); if (bytes_out != bytes_in) { perror ("Fatal write error."); return 4; } } fclose (in_file); fclose (out_file); return 0; } 
6.在字符数组中可以用字符串赋值,例如 char a[]={"gdgfdgfd fdgfdg"};花括号可以去掉。
7.在字符数组中,比如用%s输出字符串,定义一个字符数组a[20]scanf中,只需要写出a,就可以,输出时也是一样,写出a就可以,如scanf("%s",a);printf("%s",a);
8.在字符串复制中,用到头文件string,strcpy(a,b),其中a为目的字符数组要足够长,b可是数组,也可是字符串,但是a必须是字符数组,在比较中,strcmp(a,b),a>b ,返回值是正数,a=b,返回值是0,a《b,返回值是负数。strupr,小变大,strlwr大变小。
9.如果函数值的类型和return语句中表达式的值终不一样,则以函数的返回类型为准,数值类型可以自动转换,就是说函数的类型决定return的类型。
10.strchr函数的功能,返回由str所指向的字符串中首先出现ch的位置指针,如果未发现与ch匹配的字符,则返回空指针在string中,char *strchr(char *str,char ch);如char *p;pstrchr(s,u);其中s为字符数组名,u为ch
11.在二维数组中,例如a[i][j],a[i]+j就是a[i][j]的地址,例如在a[i][j]中,你可以这样定义,int *p,p=a[0],然后在输出输入中p++或者*p++.输出第几行可以int (*p)[5],p=&a[i],printf(,((*p)+j)),a[3][5].
12.字符串可以用字符数组或者字符指针指向一个字符串,char *str=“hgfhfghg”;输出时printf(,str);复制时只是将字符串的首地址给了str。指针数组的每个元素是指针,
13.指向数组的指针变量做函数参数,形参为(int *p,int n),调用为int *a=&b[0](b),(a,n),也可以用直接用数组名作为参数。当形参为数组时,实参也可以为指针变量,如(int a[ ],int n), (a,12);
14.不用中间变量间交换两个数的值,可以使用加减乘除运算,还可以使用异或运算,如交换x,y,x=x^y,y=y^x,x=x^y,
15.在位运算中,移位运算实现乘以2的多次方,或者除以2的多次方,只是被移动的二进制位不含1.
15.在位运算中,对于右移运算对于有符号的数,当为正数时,高位补0,当为负数时,最高位补0还是补1,取决于编译系统的规定,移入0称为逻辑右移,移入1的称为算数右移。
16.位运算符的优先级从高到底是,~,》》或《《,&,^,|。位逻辑运算符的优先级高于逻辑,低于关系运算符,自右向左结合,位移位运算符优先级低于算数,高于关系,自左向右结合。位复合赋值运算符的优先级与算术复合赋值运算符相同。
17.进行位运算时,长度不一样的数,按照右则对齐左则补齐,较短的数为正数,补0,负数补1.
18.实现循环移位,比如循环右移n位,首先z=x>>(32-n),y=x<<n,y=y|x.
19.在位段中,在定义时,struct s{
unsigned a:1;
unsigned b:1;
unsigned :0;
unsigned f:1;
unsigned g:2;      


};在这个定义中,unsigned为类型,a为变量名1为长度,因为有个长度为0的无名位段,所以f,g从下个字节开始存储,一共两个字节。一个位段必须存储在一个单元(一般为一个字节),不能跨两个单元,如果本单元不够存储,从下个单元开始存储。可以用%d,%u,%o,%x,等格式,以整形输出位段,在数值表达式中引用位段,系统自动将位段转换为整形数。
20.用calloc分配内存void *calloc(unsigned n,unsigned size);在内存中动态的分配n个长度为size的连续内存空间数组int *p,p=(int *)calloc(3,sizeof(int));p指向的是首地址。realloc改变原指针指向的空间大小,如i=(int *)malloc(sizeof(int)),p=(float *)realloc(i,sizeof(float)),
21.解决内存空间耗尽问题,判断指针是否为null,是马上用return终止本函数或者用exit(1)终止整个程序,为new()和malloc()设置异常处理函数。
22.auto关键字修饰一个局部变量为自动变量,意味着每次执行到定义改变量时,都会产生一个新的变量,并对其重新初始化。static修饰的变量初始化只在第一次起作用,以后变量的值保持上一次执行时的结果。对于可移植性的变量,register作用不大
,register修饰变量只是将变量保存到寄存器。
23.如果在串中包含宏名,则不进行替换,如#define p "fgfg",char s[]="fddf p",printf("%s",s),则会输出fddf p。如果串长于一行,则可以在行末尾加\续行,
24.一般将宏定义,全局变量,外部函数,typedef声明,结构体,枚举,联合体放到.h文件
25.#line命令用来改变_LINE_,_FILE_的内容,_LINE_存放当前编译行的行号,_FILE_存放当前编译的文件名,格式为#line 行号 ["文件名"],放在开头,如,#line 100 "15.c"。printf("",__LINE__),两个下划线在printf。
26.#pragma命令格式 #pragma 参数,其中参数可是message参数,该参数能够在编译信息输出窗口中输出相应的信息;code_seg参数设置程序中函数代码存放的代码段;once保证头文件只被编译一次.
27.ansi标准说明了5个预定义宏替换名,如下__LINE__,__FILE__,__DATE__(当前源程序的创建日期),__TIME__(创建时间),__STDC__(判断当前编译器是否为标准c,是标准c则是值1,否则不是).
28.FILE *fp,fp=fopen("文件名","打开放式"),fclose(fp),fputc(ch,fp),ch=fgetc(fp);读写字符串函数有文件包含名process.h,str为数组名fputs(str,fp),fgets(字符数组名,n,fp);在文件操作中,程序会把回车符当做结束符号。
29.fprintf格式 ch=fprintf(文件类型指针,格式字符串,输出列表),如fprintf(fp,"%d",i);fscanf(fp,"%d",&i);fprintf格式化写入文件中,fscanf格式化读取文件内容;包含在文件夹process.h。
30.数据块读取,fread(buffer,size,count,fp),从fp所指的文件中读取count次,每次读取大小size,讲读取得东西保存到buffer地址;fwrite(buffer,size,count,fp),从fp所知的文件中写入count次,每次大小为size,并将输出的信息保存在buffer地址中,返回值应该是count;包含在process.h。
31.随机读写函数fseek(文件类型指针,位移量,起点),其中位移量为long型(为了大于64kb),常量要加l,起点可以用0,1,2表示分别表示开头,当前,结尾为,例如fseek(fp,-20l,0)从开头往后退20个字节读写;int rewind(文件类型指针),使位置指针重新返回文件的开头,没有返回值;long ftell(文件类型指针)得到文件位置函数,返回值为-1l时为错误;都包含process.h 。
33.点运算的优先级最高,product.price++是对product.price成员进行自加,而不是先对price进行自加运算.结构体成员可以是结构体,意思是说嵌套,赋值时要找到最低级成员赋值.
34.(++pstruct)->s是先自加使pstruct指向下一个元素的地址,(pstruct++)->s取得当前元素的成员,然后再使pstruct指向下一个元素的地址.
35.共用体初始化的初始值必须和第一个成员的类型一样。 
36.  int puts(char *str),char *gets(char *str).    
37.在用typedef 时 在同一个函数体中 如果你定义了typedef struct node ,再有定义了typedef struct node 但是两个node 内容不一样 ,那么当你用node去 定义变量时 ,编译器会自动把它定义成离你变量位置最近的node 形式。 
38.在定义struct 时 关键字struct 后面的类型可以省略,但是结构体内有要用到类型的,不能。
39.在声明函数时,函数声明的可以这样fo(int,int,int)或者fo(int &,int);自己参考基本算法运算里面的快速排序,堆排序。                   当然这是我的一点点体会,以后会慢慢给大家分享一下。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/huangzhuang55/article/details/27242801

智能推荐

腾讯云发布新品数据编排平台(dop)-与大数据生态紧密结合,提供通用数据编排服务...-程序员宅基地

文章浏览阅读1.7k次。作者介绍毛宝龙腾讯高级工程师,Alluxio PMC & Maintainer,Apache Ozone committer,腾讯 Alluxio OTeam 开源协同团队负责人。主要负责腾讯 Alluxio 的研发和落地工作和 Apache Ozone 的文件系统方向的研发工作。DOP(Data Orchestration Platform)是腾讯推出的数据编排平台服务。定位通用数据编..._编排平台

Myeclipse 10.0 + Hibernate 4.3.5 连接 Oracle 11G_ssh hibenate4.3 jpa oracle11-程序员宅基地

文章浏览阅读1k次。今天从下午开始按照J2EE企业应用实战整合Myeclipse 10.0 + Hibernate 4.3.5 连接 Oracle 11G,在网上找了很多资料,到晚上才搞定。有几个地方要特别注意,我在代码中会详细讲解。现在上完整的代码:先按照书里的要求引入%\hibernate-release-4.3.5.Final\lib\required下面所有的jar包。文件1(News_ssh hibenate4.3 jpa oracle11

ubuntu 12.04下MRPT安装_ubuntu中mrpt下载-程序员宅基地

文章浏览阅读357次。Ubuntu12.04 下编译MRPT安装1.下载Linux mrpt 1.0.2源码地址:http://sourceforge.net/projects/mrpt/files/MRPT-all/MRPT-1.0.0/2.安装编译依赖的库sudo apt-get install build-essential pkg-config cmakesudo apt_ubuntu中mrpt下载

python 中的strptime()和strftime()-程序员宅基地

文章浏览阅读196次。python 中的strptime()和strftime()转自:https://blog.csdn.net/qq_39348113/article/details/82528851strptime(): 功能:按照特定时间格式将字符串转换(解析)为时间类型。 示例如下:def date_try(date): date = datetime.datetime.strpt..._strptime 2月29

Linux 基础入门 & 操作命令_命令' ls -l >tmp-程序员宅基地

这篇文章介绍了Linux系统的基础知识和操作命令,包括其特点、支持的平台以及一些常用的命令如grep。

如何在windows上安装Openssl环境_windows openssl-程序员宅基地

文章浏览阅读6k次,点赞7次,收藏13次。openssl windows版安装_windows openssl

随便推点

PopUpWindow使用详解(二)——进阶及答疑_watch_outside_touch-程序员宅基地

文章浏览阅读631次。上篇为大家基本讲述了有关PopupWindow的基本使用,但还有几个相关函数还没有讲述,我们这篇将着重看看这几个函数的用法并结合源码来讲讲具体原因,最后是有关PopupWindow在使用时的疑问,给大家讲解一下。一、常用函数讲解这段将会给大家讲下下面几个函数的意义及用法,使用上篇那个带背景的例子为基础。public void setTouchable(boolean touch..._watch_outside_touch

Oracle诊断工具-RDA_如何读懂oracle rda报告-程序员宅基地

文章浏览阅读991次。Oracle诊断工具-RDA RDA是Remote Diagnostic Agent 的简称,是Oracle用来收集、分析数据库的工具,运行该工具不会改变系统的任何参数,RDA收集的相关数据非常全面,可以简化我们日常监控、分析数据库的工作。_如何读懂oracle rda报告

Swagger2的Model不显示返回的实体_swaggerui返回没有-程序员宅基地

文章浏览阅读3.3k次。原因:将实体类属性私有化了,同时并未给属性提供get,set方法,最后导致Model不显示请求返回的实体属性,解决方法:给私有的属性加上get、set方法即可,或者将属性public最后:swagger依赖3.0版本的访问路径:http://localhost:8081/swagger-ui/index.html..._swaggerui返回没有

支持向量机的基本思想_深度讲解支持向量机背后的数学思想-程序员宅基地

文章浏览阅读535次。在支持向量机(support vector machine,SVM)算法中,有诸多数学思想。学习SVM是一个非常好的实践数学思想的过程,为我们以后创新解决问题思路提供了启发。在卷积神经网络兴起之前,在机器学习界一直是非常受追捧的算法,不光是因为其有良好的泛化能力、很高的准确度,更是因为其完备的数学理论依据以及诸多较难理解的数学知识。这两点让人们觉得SVM是一个很精妙很酷的算法!所以在实际应用也非常..._简述支持向量机中核函数方法的基本思想。

曲率高斯滤波去噪python实现(附代码详解)_曲率滤波-程序员宅基地

文章浏览阅读7.3k次,点赞8次,收藏40次。曲率高斯滤波及平均滤波去噪python实现(附代码)曲率滤波的理论基础可以参考下曲率滤波的理论基础和应用,这篇博客介绍的思想完美的避开了一大堆数学公式,简直是我的福音,但还是要细看的,不然很容易忽略重点,我这里就简单的做个总结,所有图片均来源于前面这篇博客。曲率滤波基本原理1、曲率曲面上的一点有一切平面tangent plane,此点处会有各个方向上的曲率,但是必然会有最大主曲率和最小主曲..._曲率滤波

AI之AutoML:Google AutoML(Google Cloud自动化机器学习平台库)的简介、安装、使用方法-程序员宅基地

文章浏览阅读1.4w次,点赞10次,收藏34次。​AI之AutoML:Google AutoML(Google Cloud自动化机器学习平台库)的简介、安装、使用方法目录Google AutoML(Google Cloud自动化机器学习平台库)的简介AutoML的安装AutoML的使用方法Google AutoML(Google Cloud自动化机器学习平台库)的简介​​​​​​​1、Google AutoML的概述背景 ​​​​​​​AutoML 基于谷歌最新的图像识别技术神经架构搜索( Neural A_automl

推荐文章

热门文章

相关标签