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);自己参考基本算法运算里面的快速排序,堆排序。                   当然这是我的一点点体会,以后会慢慢给大家分享一下。
Verilog是一种硬件描述语言(HDL),用于编写和描述数字电路和系统的行为。它可以用来设计和模拟各种数字电路,从简单的逻辑门到复杂的处理器和系统。 使用Verilog可以方便地描述电路的结构,信号的传输和逻辑功能。它采用模块化的设计方法,可以将整个电路分解为多个模块,每个模块负责执行特定的功能。这样,可以更容易地理解和维护电路,并促进代码的复用。 Verilog还提供了丰富的建模功能,用于描述数字电路中的时序和同步逻辑。通过使用时钟信号和触发器,可以实现电路的状态转换和时序操作。这对于设计时序电路,如计数器和状态机,非常有帮助。 Verilog语言具有良好的可扩展性和灵活性。它可以与其他编程语言(如C/C++)结合使用,实现高级功能和算法。此外,使用Verilog还可以进行电路仿真和验证,以确保电路的正确性和性能。 Verilog语言在数字电路设计和工程实践中广泛应用。它被用于各种领域,包括芯片设计、嵌入式系统、通信和网络设备等。通过使用Verilog,工程师们可以更高效地设计和实现复杂的数字电路,从而提高产品的质量和性能。 总而言之,Verilog是一种强大的硬件描述语言,用于描述数字电路和系统。它提供了丰富的建模和设计功能,方便工程师们进行电路设计、模拟和验证。通过使用Verilog,可以实现高效、可靠和高性能的数字电路设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值