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 # include 
 3 int main(void)
 4 {
 5     printf("Hello World\n");  // \n表示换行
 6     return 0;
 7 }
8 //2.printf("输出控制字符",输出参数); 9 # include 10 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 # include 18 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 #include 27 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 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) } }
//读取-这里读取函数有误,实现方法为存储函数的反向应用 void flashGetSysData(SysData *data) {    }
/*
输入参数“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

//
C