![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C编程基础
iot_hept
这个作者很懒,什么都没留下…
展开
-
按位异或运算^
按位异或(xor):A xor B 若A,B相应位相等时结果为0,相应位不等时结果为1 规律: 一个数与0异或等于自身:0^0=0 1^0=1 一个数与1异或等于取反:0^1=1 1^1=0 一个数与自身异或等于0:a^a=0 运用: 交换两个数a和b,不用中间变量 a=a^b; b=b^a; //b=b^a=b^(a^b)=a^原创 2015-03-19 08:41:50 · 1048 阅读 · 0 评论 -
函数指针问题,求解答
代码中给函数指针赋值的 语句1、2、3 以及用函数指针调用函数的 语句a、b 运行结果都正确,到底哪个才是正确的呢??? #include int add(int a,int b){ return a+b; } int main() { int (*p)(int,int); int sum; p = add; //语句1 // p = &add; //语句2 // p =原创 2015-08-17 07:31:30 · 868 阅读 · 5 评论 -
C语言各种关键字
1、register 在函数内定义变量时,默认是 auto 类型,变量存储在内存中,当程序用到该变量时,由控制器发出指令将内存中该变量的值送到运算器,计算结束后再从运算器将数据送到内存。如果一个变量用 register 关键字修饰,编译器则尽可能将该变量存放在CPU的内部寄存器中,这样就不用通过内存寻址来访问变量,可以大大提高访问效率。 2、volatile volatile关键字修饰的变量原创 2015-08-17 07:29:43 · 641 阅读 · 0 评论 -
位域
#include union{ struct{ unsigned char c1:3;//位域操作 unsigned char c2:3; unsigned char c3:2; }s; unsigned char c; }u; int main() { u.c = 100; printf("%d\n",u.s.c1); printf("%d\n",u.s.c2); pr原创 2015-08-14 07:30:02 · 1028 阅读 · 2 评论 -
高效统计整数中 1 的比特数
输入一个无符号整数,统计该整数中含1的比特数。 #include int numbits(unsigned int n) { int count = 0; while(n>0){ n &= (n-1);//每次操作去掉n中最低位的1 count++; } return count; } int main() { unsigned int n; scanf("%d",&n)原创 2015-08-14 07:27:45 · 928 阅读 · 0 评论 -
条件编译
1、ifdef #ifdef XXXXX ...... #endif如果XXXXX被定义了,则编译上述代码。 2、ifndef #ifndef XXXXX ...... #endif如果XXXXX没有被定义,则编译上述代码。 3、if #if XXXXX ..... #endif如果XXXXX被定义了,并且值为真,则编译上述代码。 4、if define原创 2015-08-13 07:24:01 · 884 阅读 · 0 评论 -
C语言内存分配
C语言的内存分配主要有5个区域: 1、栈区:在执行函数时,函数内的局部变量(不包括static变量)、函数返回值的存储单元在栈区上创建。函数执行结束时这些存储单元自动被释放。栈区内存分配运算内置于处理器的指令集中,效率很高,但分配的内存容量有限。 2、堆区:程序在运行的时候用malloc(calloc、realloc等)申请的内存,要由程序员自己负责用free释放内存。 3、静态存储区:存放原创 2015-08-13 07:20:59 · 769 阅读 · 0 评论 -
字符串复制
要求:编写一个函数,实现类似strcpy的字符串复制函数。原型定义为 char * mystrcpy(char *dest, char *src)。功能是把src所指向的字符串复制到dest所指的数组中,返回dest指针。(提示:src和dest所指向的区域有可能重叠)。 简单版本: char * mystrcpy(char *dest, char *src) { char *p = d原创 2015-08-12 07:47:27 · 1586 阅读 · 4 评论 -
结构体,联合体,内存分配
#include struct a{ char x[6]; int y; char z[6]; }; struct b{ int y; char x[6]; char z[6]; }; union c{ char x[6]; int y; char z[6]; }; int main() { printf("%d,%d,%d\n",sizeof(struct a),sizeof原创 2015-08-12 07:53:12 · 1322 阅读 · 0 评论 -
指针,指针,指针。。。
1、指针常量与常量指针 int a = 10; int * const p1 = &a; const int * p2 = &a; p1是不可改变地址的常量,即指针常量,但可以对它所指向的内容进行修改。 p2是指向常量的指针,即常量指针,它所指向的地址内容是不可修改的,但其本身确实可以修改的。 2、指针运算 #include int main() { int原创 2015-08-11 07:37:09 · 1994 阅读 · 0 评论 -
筛选法求素数
原理:大于 1 的任意一个自然数的倍数(大于1)一定不是素数;从2开始升序遍历,找到一个素数就将它的倍数标记为合数,当一个数是合数时它的倍数已经被标记过,可以直接跳过; #include #define SIZE_N 1000 int prime[SIZE_N]; int main() { int i,j,temp; for(i=0;i<SIZE_N;i++) prime[i]=1; pr原创 2015-03-23 08:32:33 · 777 阅读 · 0 评论 -
指针取值(*)与自增(++)运算
++(*p) 先取指针指向的内容,然后给内容加1,加1操作当前生效。等价于++*p (*p)++ 先取指针指向的内容,然后给内容加1,加1操作在该语句执行后生效 *(p++) p指针加1,加1操作在该语句执行后生效,然后取当前p指针指向的内容。等价于*p++ *(++p) p指针加1,加1操作当前生效,然后取当前p指针指向的内容。等价于*++p 对于不同类型的指原创 2015-03-28 09:27:45 · 993 阅读 · 0 评论 -
printf那点事
1、打印内存地址 #include int main() { int a; printf("%p\n",&a); //%p打印地址,自动加前缀00 printf("0x%x\n",&a); //%x以十六进制打印 return 0; }输出结果: 0012FF44 0x12ff44 2、printf,sprintf,snprintf 原型: in原创 2015-08-07 09:12:08 · 754 阅读 · 0 评论