C语言学习杂记

本文详细讲解了extern、volatile和static关键字的作用,涵盖常量指针、指针常量和指向常量的指针常量,以及字符串拼接、十六进制转十进制、浮点型在串口通信中的转换。通过实例演示,帮助理解这些概念在实际编程中的运用。
摘要由CSDN通过智能技术生成


extern、volatile、static关键字

  • extern 通常在头文件(a.h)定义,由此在其它文件(b.h引入#include “a.h”)可使用前者的变量、函数
  • 存储限定符volatile 是易变的、不稳定。声明如操作系统、硬件或者其它线程等因素修改了变量,而每次使用的时候必须从内存中取值,即从该变量的地址直接取值。编译器优化工作的一个假设,在多任务共享变量、中断与任务共享变量时,必须使用volatile,强制读取内存中的值。
  • static 存放在静态数据区、静态局部、静态全局。
    • 隐藏,静态全局 在本文件可用
    • 隔离
    • 持久,仅一次初始化为0
      一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区,前者是需要程序员手动申请和释放,后者由编译器自动分配和释放的。

常量指针、指针常量、指向常量的指针常量

  • 常量指针(常指针):const int *p; 本质上是指针,值不可改变,而可以通过改变指向(更改值)
    #include <stdio.h>
    int main() {
        int num1 = 1, num2 = 2;
    	// 常量指针
    	const int *p = &num1;
    	printf("%d\r\n", *p);	// 1
    	// 改变指向
    	p = &num2;
    	printf("%d\r\n", *p);	// 2
    
    	num2 = 3;
    	printf("%d\r\n", *p);	// 3
    	return 0;
    }
    
  • 指针常量:int * const p; 本质上是常量,值可以改变,而指向不可改变
    #include <stdio.h>
    int main() {
        int num1 = 1;
    	// 指针常量
    	int * const p = &num1;
    	printf("%d\r\n", *p);	// 1
    	// 改变值
    	num1 = 2;
    	printf("%d\r\n", *p);	// 2
    	
    	*p = 3;
    	printf("%d\r\n", num1);	// 3
    	return 0;
    }
    
  • 指向常量 的 指针常量,const int * const p,指向和值都不可改变
    #include <stdio.h>
    int main() {
        int num1 = 1;
    	// 指向常量 的 指针常量
    	const int * const p = &num1;
    	printf("%d\r\n", *p);	// 1
    	
    	num1 = 2;
    	printf("%d\r\n", *p);	// 2
    	return 0;
    }
    
  • const int const *p
    #include <stdio.h>
    int main() {
        int num1 = 1;
    	
    	const int const *p = &num1;
    	printf("%d\r\n", *p);	// 1
    	
    	num1 = 2;
    	printf("%d\r\n", *p);	// 2
    	return 0;
    }
    

字符串char[]拼接及十六进制转十进制

#include <stdio.h>  
#include <string.h>
int main()  
{  
    char str1[] = "09";
    char str2[] = "A1";     
    int num = 0;
    // "09a1"
    strcat(str1,str2);
    // 2465
    sscanf(str1,"%x",&num);
    
    printf("%d\r\n", num);  
    return 0;     
}  

注 atoi()只能针对十进制字符串转整型

#include <stdio.h>
#include <stdlib.h>
int main()
{
	char str[] = "11";
	int num = atoi(str);
	printf("%d\r\n", num);
	return  0;
}

保留高位0

#include <stdio.h>
int main()
{
	int num1 = 0x01;
	// 这里低位保留为02,而非2
	int num2 = 0x02;
	int num3 = (num1 << 8) | num2;
	// 102 258
	printf("%x %i", num3, num3);
	return 0;
}

串口传输float浮点型转换

.h

typedef union _Float_u{
	struct 
	{
		unsigned char char_bit_0;
		unsigned char char_bit_1;
		unsigned char char_bit_2;
		unsigned char char_bit_3;
	}Float_s;
	
	int integerVal;
	float floatVal;
	uint8_t u16_to_u8[4];
	uint16_t u8_to_u16[2];
}Float_u;

.c

Float_u float_u;
float_u.floatVal = 3.14159;
uint8 buf[4];
buf[0] = float_u.char_bit_0;
buf[1] = float_u.char_bit_1;
buf[2] = float_u.char_bit_2;
buf[3] = float_u.char_bit_3;
// or
buf[0] = float_u.u16_to_u8[0];
buf[1] = float_u.u16_to_u8[1];
buf[2] = float_u.u16_to_u8[2];
buf[3] = float_u.u16_to_u8[3];
// revert
float_u.u16_to_u8[0] = buf[0];
float_u.u16_to_u8[1] = buf[1];
float_u.u16_to_u8[2] = buf[2];
float_u.u16_to_u8[3] = buf[3];
printf("%f", float_u.floatVal);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值