C语言之心得总结(一)
1、C语言结构体在多个文件中使用的方法
//步骤1 //在头文件(mpu.h 文件)中对结构体类型进行定义 例: //定义结构体类型 struct MPU { short Acce[3]; short Gyro[3]; short Mag[3]; } //步骤2 //在需要使用上述结构体类型的 mpu.c 文件中定义结构体类型变量 //定义结构体类型变量 struct MPU mpu_value; //步骤3 //除 mpu.h mpu.c 文件,其他文件需要使用上述结构体类型变量时,需要在 mpu.h 文件中声明上述结构体类型变量为全局变量 extern struct MPU mpu_value;
2、strstr(str1,str2)函数
1 /* 2 strstr(str1,str2) 函数是字符串处理函数之一,位于头文件 “string.h” 3 定义:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址,否则,返回NULL。 4 */ 5 //举例说明 6 //包含 7 char str1 = "123456"; 8 char str2 = "235"; 9 strstr(str1,str2) = 23456; 10 //不包含 11 char str1 = "123"; 12 char str2 = "456"; 13 strstr(str1,str2) = NULL;
3.printf函数-输出函数-头文件“stdio.h”
1 //1.printf("字符串\n"); 2 # include3 int main(void) 4 { 5 printf("Hello World\n"); // \n表示换行 6 return 0; 7 }
8 //2.printf("输出控制字符",输出参数); 9 # include10 int main(void) 11 { 12 int i = 1; 13 printf("%d\n", i); /*%d是输出控制符,d 表示十进制,后面的 i 是输出参数*/ 14 return 0; 15 }
16 //3.printf("输出控制符1 输出控制符2...",输出参数1,输出参数2,...); 17 # include18 int main(void) 19 { 20 int i = 1; 21 int j = 2; 22 printf("%d %d\n", i, j); 23 return 0; 24 }
25 //4.printf("输出控制符 非输出控制符",输出参数); 26 #include27 void mian(void) 28 { 29 int i = 1; 30 printf("%dKM\n",i);//其中%d为输出控制符,KM为非输出控制符 31 }
/*输出控制符*/ %d 按十进制整型数据的实际长度输出 %ld 输出长整型数据 %md m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于 m,则按实际位数输出 %u 输出无符号整型%c 用来输出一个字符 %f 用来输出实数,包括单精度和双精度,以小数形式输出%.mf 输出实数时小数点后保留 m 位 %o 以八进制整数形式输出 %s 用来输出字符串。用 %s 输出字符串同前面直接输出字符串是一样的。但是此时要先定义字符数组或字符指针存储或指向字符串 %x、%X、%#x、%#X) 以十六进制形式输出整数
四、C 转义字符
五、结构体的存储(Flash、EEPROM)
//利用结构体指针实现结构体数据类型的存储和读取 //有下面一个结构体 typedef struct { u8 Name;//名字 u8 Age;//年龄 u8 Score;//分数 }Student; //通过sizeof关键字可以获取这个结构体类型的存储空间为3字节//读取-这里读取函数有误,实现方法为存储函数的反向应用 void flashGetSysData(SysData *data) { }
//存储 void Flash_Write(Student *data) { u8 i=0,temp=0; for(i=0;i<sizeof(*data);i++) { memcpy(&temp,((u8 *)(data))+i,1); Flash_Write_OneByte((Flash_Data+i),temp) } }
/*
输入参数“Student *data”为结构体类型的指针,data指向该结构体的首地址,“data+1”则会使该指针地址向后跳过3个字节,因为data是结构体类型的指针,且该结构体在内存中占用连续的3个字节,并被认为是一个变量,如果指针+1,其指向的地址将会向后跳入一个完整的结构体存储空间,即3个字节 如果需要使用这个指针访问该结构体的每一个成员变量,即每次指针+1,地址跳过1Byte,则需要将该结构体类型的指针转换为unsigned char类型的指针“(u8 *)(data)”,这时再+1,则会跳一个字节。 */
六、return
return 即从此函数返回到调用函数里
七、位操作
#define setbit(x,y) x|=(1<#define clrbit(x,y) x&=~(1<#define reversebit(x,y) x^=(1<#define getbit(x,y) ((x) >> (y)&1) //获取某一位的值
八、memset();
//函数原型为extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组, c:是赋给buffer的值, count:是buffer的长度
//此函数多用于清空数组,eg:memset(buffer,0,1024);
九、argc
int main(int argc,char* argc[])意义解析
argc是命令行总的参数个数,其中第0个参数是程序的路径和名字,后面的参数命令行是用户输入的参数
char* argc[]是一个字符数组,数组里每个元素代表一个参数
示例:
在c盘有main.c文件,生成可执行文件mian.c
int main(int argc,char* argc[])
{
int i;
for(i=0;i printf("位置 %d is %s.\n",i,argc[i]);
return 0;
}
如果输入的是:main.exe a b
则输出:
位置 0 is c:\main.exe
位置 1 is a
位置 2 is b
十、共用体
在步进电机开发过程中遇到以下需求‘要求输入一个十进制参数,转化成如数组RunRotate_1内的数据形式,RunRotate_1[] ={0x00,0x00,0x21,0x34} ’
可以采用共用体解决这个问题。实现思路:使用union声明一个共用体, 在共用体内定义一个32位的int数据类型和长度为4的char类型数组,通过给int类型
赋值,如int = 8500,在内存存的数据其实是:0000 0000 0000 0000 0010 0001 0011 0100(无论是几进制的数据,在内存中的数据始终是二进制的
,且不会变化),这样char类型数组的每个数据刚好对应内存中的int类型的相应字节。 实现代码:
union Data //声明
{
int i;
char str[4];
};
int main(void)
{
char str1[4] = {0x00,0x00,0x00,0x00};
union Data data; //定义
data.i = 8500;
str1[0] = data.str[0];
str1[1] = data.str[1];
str1[2] = data.str[2];
str1[3] = data.str[3];
//则str1[0] = 0x00,str1[1] = 0x00,str1[2] = 0x21,str1[3] = 0x34;
}
十二、十六进制输出时显示fffffff
//