C语言基础小结(二)

来源:互联网 发布:plc编程软件下载地址 编辑:程序博客网 时间:2024/05/21 08:39
26. 位段:指定结构体中成员变量所占的位数(以位的形式紧凑存储)
unsigned char/int aaa:1
这里只能是unsigned char/int类型
27. 指针数组:int *p[10]
数组指针:int (*p)[10]
指针数组:首先是个数组,该数组的每个元素都是指针;
数组指针:首先是个指针,这个指针指向一个数组;
28. 逗号运算符,逗号表达式,又称顺序求值运算符。
从左往右计算,整个表达式的值是最后一个表达式的值,逗号运算符的优先级最低。
表达式1,表达式2,表达式3……表达式n
从表达式1开始计算,直到表达式n,最终的值为表达式n的计算结果。
29. 二维数组a[m][n]表示有m行n列,每一行都是一个一维数组,每个一维数组里都有n个元素。
30. 在C语言中,当一维数组作为函数形参时,编译器总是把它解析成一个首元素首地址的指针。
31. 无法把一个指针变量本身传递给函数;
32. 函数指针:
char fun(int t){return ‘A’;}
int main()
{
char (*p)(int); /*定义一个指针,它指向一个形参为int形的,返回值为char形的函数*/
p=fun;
return 0;
}
33. 堆(heap):由malloc系列函数分配,空间大,没释放之前一直存在,直到程序结束或由free释放;
栈(堆栈)stack:保存局部变量,只在函数内部有效,函数结束时就自动释放,效率高,空间有限
全局区(静态区):保存自动全局变量和static变量(包括static全局和局部变量),在整个程序生命周期内都存在。
34. 断言assert
#include <assert.h>
void assert( int expression );//这是一个宏,而不是函数;
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行;
可以用在函数开始处检验传入参数的合法性;
不能使用改变环境的语句或改变变量的语句;
每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败;
35. 内存分配和释放函数
void *malloc(size_t size)内存分配函数:向内存申请堆空间,申请成功则返回开始地址,失败返回NULL。返回的空间没有被清空。
void *realloc(void *ptr,size_t size)向内存归还旧空间,申请一片新空间,并且将旧空间中的数据复制到新空间中,但增加的空间不清零;
void *calloc(size_t nmenb,size_t size)向内存申请堆空间,给有nmenb个元素,每个元素大小为size的数组使用,并且清零;
void free(void *ptr)释放由以上三个函数申请的堆空间;
以上4个函数均在<stdlib.h>中
36. void *memset(void *s, int c, size_t n)把指针s所指向的空间里的n个字节设置为值c,在<string.h>中;
37. 用malloc申请0字节的空间,返回的不是NULL指针,而是一个正常的地址,但此地址的空间无法使用。
38. 在free之后,建议把指针设置为NULL。
39. 不用全局和局部变量,不用库函数写my_strlen()函数
int my_strlen(char *p)
{
assert(p!=NULL);
return (*p!=’\0’)?(1+my_strlen(++p)):0;
}
40. 两个整数相除,结果在横轴上向0点的方向取整;
-3/-2=1
-2/-3=0
-3/2=-1
-2/3=0
3/2=1
2/3=0
41. 两个正数求余运算,运算结果的符号位和被求余的数符号相同。
求余运算只能在整数之间,不能是浮点数(编译会出错)。
-3%2=-1
3%(-2)=1
2%(-3)=2
(-2)%3=-2
42. 按位取反运算符~
~a=-a-1
~0=-1
~1=-2
43. 左移运算符<<
右边的空位补0
右移运算符>>
左边空位补符号位
44. 异或运算符^(a^b,a和b相同则结果为0,不同就为1):
1^1=0
1^0=1
0^1=1
0^0=0


///////////////////////////////////////////////////////////////////////////////////
与运算符&(a&b,a和b中有一个为0,结果就是0;只有a和b都是1,结果才为1):
1&1=1
1&0=0
0&1=0
0&0=0


///////////////////////////////////////////////////////////////////////////////////
或运算符|(a|b,a和b中有一个为1,结果就是1;两个都不是1,结果就是0):
1|1=1
1|0=1
0|1=1
0|0=0


以上三个运算符都是做位运算!
45. 一道笔试题
int a=1;
int b=2;
a=a^b;
b=a^b;
a=a^b;
运算结果刚好是a和b的值交换,如果a=b,则结果为0
46. 正数a|正数b=a+b
47. 对齐补齐
一个变量的地址一般是这个变量所占字节数的倍数
补齐:补到结构体中成员变量所占的最大字节数的倍数
48. 字符串操作系列函数
strlen(a)计算字符串长度,不包括’\0’
strcpy(a, “abcd”)将字符串复制到字符串数组a中(覆盖原有)
strcat(a, “abcd”)将字符串追加到a中
strcmp(a,”abcd”)比较a和”abcd”是否相等,返回0或非0
49. fun()表示该函数形参的类型和个数都不定,在调用它时,可以传递任何形参给它,只是传过去没用;
fun(void)表示该函数不允许传递任何形参给它,否则编译出错。
50. 可变形参
#include <stdarg.h>
int fun(int cnt, …)
{
va_list ls; //定义可变长参数表
va_start(ls, cnt);//用可变长参数表ls保存参数cnt之后的那些参数
va_arg(ls, int); //从参数表中取出一个int型的参数,并且将指针指向下//一个
va_end(ls); //释放可变长参数表
}
这些都是宏,不是函数。
51. 判断一个浮点数是否为0
float f;
if(f>=-0.00001&&f<=0.00001)
{
f等于0;
}
else
{
f不等于0;
}
原创粉丝点击