1.修饰局部变量时: 延长生命周期同时,该局部将存放在全局变量所在的区域。 2.修饰全局变量或函数时: 该全局变量或者函数只能在本文件中使用,不能用extern声明后在其他文件中调用。
作用:被修饰的变量,变为只读属性,不能被更改,增加程序的健壮性。 1.修饰的变量不能被改变,但是可以通过指针更改 2.修饰指针时:
const char *p; // *p不能改变,p可以改变 char const *p; // *p不能改变,p可以改变 char * const p;// p不能改变,*p可以改变 const char * const p;// *p 和 p都不能改变被修饰变量,每次读取时都要从内存中读取,防止出现意外。 (最常见的例子是,修饰传感器等外设寄存器内存放的数据,因为这些变量可能被意外的改变) 程序中的例子:
int a = 3; int b = (++a)+(++a); printf("a = %d\n",b); /** * 编译器不同,结果为8或者10。不会是9。 * 当变量a用volatile修饰之后结果为9。 */格式:typedef int myint; 作用:给数据类型其别名 例子:函数指针类型。
strcat
char* mystrcat(char *str1,const char* str2) { char *str = str1; while(*str1 != '\0') str1++; while(*str2 != '\0') { *str1 = *str2; str1++;str2++; } return str; }strcpy
char* mystrcpy(char *str1,const char* str2) { char * str = str1; while(*str != '\0') { *str = *str2; str++;str2++; } return str1; }strcmp
int mystrcmp(char *str1,const char* str2) { while(*str1 != '\0') { if(*str1 > *str2) return 1; else if(*str1 < *str2) return -1; str1++;str2++; } return 0; }atoi
#include <stdio.h> #include <ctype.h> //isspace跳过空格和/t //isdigit判断是不是数字 int atoi(char s[]) { int i,n,sign; for(i=0;isspace(s[i]);i++)//跳过空白符; if(s[i]=='+'||s[i]==' -')//跳过符号 { sign=(s[i]=='-')?-1:1; i++; } for(n=0;isdigit(s[i]);i++) n=10*n+(s[i]-'0');//将数字字符转换成整形数字 return sign *n; }字符串逆序
都是单目运算符时 大于++(因为 也有可能是双目运算符乘号) 另:单目运算符优先级高于双目
2[a] ==== a[2]
二进制 111 1011 八进制 0173 十进制 123 十六进制 0x7b
法1:加减法
a = a + b; b = a - b; a = a - b; 优点:易理解,可用于浮点型 缺点:有范围限制,A+B大于取值范围时会出错法2:异或法
a = a ^ b; b = a ^ b; a = a ^ b; 优点:交换速度快 弊端:难理解,对于浮点型束手无策法2效率更高,有几位循环几次 法1:与移位法
void totalOne(int x) { int count = 0; while(x) { if(x & (1<<31)) count++; x << 1; } printf("count = %d/n", count); }法2:与减法
// 判断一个整数的二进制位中有多少个1 void totalOne(int x) { int count = 0; while(x) { x = x & ( x - 1 ); count++; } printf("count = %d/n", count); }