C语言笔记1[杂项小知识点]

1.system(“s”);调用一个系统程序,如调用Windows计算器system(“calc”);不过这个函数会产生一个CMD命令框,为了不产生,可以调用Windows.h下的WinExec();如
WInExec(“calc”,SW_NRMAL);第二个参数一般为SW_NRMAL。
下面是三个关于调用.exe函数使用说明的链接:
http://blog.csdn.net/manji_lee/article/details/8079110
关于system和WinExec的区别,可以参考下面的链接:
http://shashanzhao.com/archives/642.html
以上链接都来自这个

2.SetwindowsPos();也是Windows.h下的一个函数可以改变一个窗口的大小和位置,有6个参数,
第一个是窗口的句柄(使用VS,打开工具点击spy++(x64),点击望远镜标志,然后拖动靶子到窗口上可得到句柄,然后参数填入16进制模式,过程中不能关闭要改变的窗口,否则要重新取句柄);
第二个参数默认为NULL;
第三个、第四个为距离屏幕起始位置(左上角)的坐标,任意设置,不超过屏幕范围就行,分别为X,Y;
第五个第六个为大小,分别为W,H,(宽高)。

3.sleep(),也是Windows.h下的一个延时函数,相当于DelayMs();分辨率为毫秒。

4.指针指向一个数组或者指针,此指针变化,指向的指针也跟着变化,数组无变化。相当于浅拷贝。如int *p,*q,array[10]={1,2,3,4,5,6,7,8,9,0};
p=array;p=array;
在这里插入图片描述
int *q;
int *p=calloc(10,sizeof(int));
strcpy(p,“帅比”);
q=p;
printf("%s\n",q);
free§;//此时可以打印出正常值,但是当free放到打印语句前时则会失败,因为这种赋值称为浅拷贝,当赋值成功后,两个指针指向同一块堆内存,释放掉内存后,q成为一个野指针,所以无法正常输出。
深拷贝:
int *q=calloc(10,sizeof(int));
int *p=calloc(10,sizeof(int));
strcpy(p,“帅比”);
memcpy(q,p);
printf("%s\n",q);
free§;
free(q);

5.函数指针。指针可以指向一个定义的函数。如int fun(int m,int n)
int (p)(); //可以让 p=fun。然后返回值 可以这样输出。a=p(m,n);

6.对负数移位,最左边的用1填充>>>是无视符号位的右移,>>右移是补符号位,所以负数移位时不补1。

7.用异或交换两个整型变量的值:
a=a^b;
b=a^b;
a=a^b;
或者
a=a+b;
b=a-b;
a=a-b;

8.如果要使用strcpy函数来复制字符串,若两个参数有重复的地址也就是两个参数是同一个指针变量不同的下标。则会出现错误,数据会混乱。
这时可以使用memmove(地址,地址,复制数量),采用的是将要复制的数据先保存在一个缓冲区,在将缓冲区的赋值给第一个参数。
或者memcpy(格式同上)。虽然memcpy();也没考虑数据重叠的情况,但在实际应用情况下,我好像没发现问题

9.int ungetc(int c, FILE *stream);
形参:
c: 要写入的字符;
stream:文件流指针
返回值:
字符c - 操作成功,EOF - 操作失败(int)
如ungetc(ch, stdin);将你读到的字符回退到输入流中
比如上面的程序你先输入数字25,scanf读到i中,加到sum中,然后你再输入,
调用ch=getchar(),发现ch不是’ ‘也不是’\n’,而是一个数,比如’7‘,
显然这是你要继续加到sum中的数,要用scanf读到i中,但是你已经将这个’7’
用getchar读出来了,只好用ungetc再把这个’7’给退回去。

10.四大区:
代码区:函数、代码、常量、可执行代码
静态区:地址从低到高增长,全局变量,静态变量,字符串常量
栈区:stack,地址从高到低增长,动态变量,形参,函数返回值
堆区:地址从低到高增长:malloc或者new分配的空间,没有先进后出的顺序。

11.malloc只管分配内存;如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。
calloc分配的内存已经全部初始化为0;
realloc时重新分配malloc或者calloc在堆中分配的空间大小,比如扩大分配的内存:
s=realloc(s,strlen(s)+n);n为增加的空间。
在64位Windows系统下,每次堆的变化最小为4k,如果需要1k空间,操作系统会给4k空间,优点是操作系统效率提升,缺点是浪费内存。

13 . 通过返回值返回一个地址,不能用动态变量,可以用静态变量或者分配一个堆空间。
通过形参返回一个地址不能用一级指针,只能用二级指针.

14.unsigned char a : 2; 可以把a设置为只占两位空间,如a=5D(0101B),则只会输出1D,即(01B)
char b : 4 ;a=13D(1101B),因为只有四位,而且为有符号类型,所有最高位系统认定为符号位,所以实际打印出来的值为-3;
struct B
{
unsigned char a1 : 1;

a8 : 1;
};//结构体只占用1个字节,如果到a9,则占用两个字节,因为处理器的最小单位为1BYTE;
处理器处理int类型的效率最高,而char实际上也是一个整型.

15.struct D
{

};//在C语言环境下编译错误,因为C要求结构体至少有一个成员,而在C++环境下语法成立.

16.当结构体发生嵌套是,数据是分别对其的,如:
struct A1 { int c;char d; };
struct A2 { struct A1 x; char a; int b; };//一共占用了16个字节,x占用8,a,b占用8.

17.union(联合体):是一个能在同一个储存空间存储不同类型数据的类型。
union
{
int a1; //联合体所占用的内存等于其最长成员的长度,也叫共用体。
short a2; //虽然可以有多个成员,但是同一时间只能存放其中一种。
char a3; //联合体内最好不要出现指针,如果为指针分配空间后不可给其他
}; //成员赋值,因为会导致这个指针指向一个新得地址(被赋的值),造成指向不明地址,可能会导致段错误,同样free也不起作用。

18.enum(枚举):类型是常量
enum ABC { you, me,he };默认值是0,1,2;即you=0;
也可以更改默认值,如
enum ABC { you=100, me=50,he,her};默认值是100,50,51,52;即he=51;
举例:
enum ABC { you, me,he };
enum ABC s;
s=you;
int man;
man = s;
也可以直接 man = you,因为enum枚举的成员就是一个常量.

19.int a = 100; 意思为:CPU生成一个立即数100,在栈中分配一个4字节的空间,然后把这个给空间的值设为100;

20.wchar_t:两个字节的字符类型(在宽码操作系统中内部处理字符一般用wchar_t),如当使用Unicode字符集时.

21.c语言中 切割字符串的函数:
strtok函数(const char *str, const char *ch)
第一个是字符串,第二个是以那个字符做切割。
第一次调用时,填入想要切割的字符串,以后调用第一个参数填NULL即可。

例子:
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[] = "123-sldkf-123ls-343434-dfjdlkfj-dflcmvn";
char *delim = "-";
char *p;
printf("%s ", strtok(s, delim));
while((p = strtok(NULL, delim))
printf("%s ", p);
printf("\n");
return 0;
}
char s[] = "dlkjf-sdlkfjsdf\lsdkljfl'sldkjf\sdkfjsdlf\lskdjfls";
如果想用-和\两个符号切割的话
char *delim = "-\";
这样就可以了

上面资料链接strtok示例

22.int stat(const char *path,struct stat *buf),得到一个文件的属性。头文件支持
<sys/stat.h>. *path为一个文件的名字,字符串形式.
实际上stat是一个结构体
struct stat st = {0};
stat(“a.txt”,&st);//得到的属性信息储存在st结构体中。
如得到文件大小。
int size=st.st_size;//里面还要好多其他种类的成员。

23.fflush函数可以将缓冲区中任何未写入的数据写入文件中,成功返回0,失败返回EOF.
int fflush(FILE *file);
由于该函数是实时将缓冲区的内容写入磁盘,所以不要大量去使用,因为磁盘操作效率太低。

24.remove(“a.txt”);删除文件a.txt;
rename(“a.txt”,“b.txt”);将a.txt文件名改为b.txt
fgets,fputs,fprintf,fscanf这些都是针对文本文件读写的,不能对一个二进制文件进行读写,而例如图像文件,音频文件等等都是二进制文件。可以用fread,fwrite进行操作.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值