C语言小知识

1. malloc的使用

char *p = (char *)malloc(0);
debugprintf("p= %p\r\n",p);

以上输出结果不为NULL

2. volatile的使用
意味着每次使用都会读取这个变量的值
a. 用于获取或者改写寄存器的值时

 *(volatile U32*)r_tpcon = 1<<1;

b. 中断里访问的变量
c. 操作系统中的信号量
另外,用于只读寄存器,要使用const volatile
3. const的使用
a. 只读型的数据
b. 用来保护不希望被修改的参数

const int a;
int const a;
以上两种含义相同
const int *p;	//表示p所指的对象值不能变,但p可以变更
int* const p;	//表示p所指对象可变,但是p不能变
const int* const p ;    //p和其所指对象都不能变

4. 中断服务函数
中断服务函数一般没有参数的输入,并且一定没有返回值,经常在中断中操作的变量,要使用volatile类型

int a;
int *a;
int (*a)[10] ()的优先级更高,所以这是一个指针,指向一个有10个整形成员的数组
int (*a[10])(int) 如果没有括号,[]的优先级更高,所以这是一个数组,存放了10个函数指针
int *a[10] 如果没有括号,[]的优先级更高,所以这是一个数组,存放了10个指针,指向的类型是整型变量

6. static的作用
a. 函数内,只会赋一次初值,相当于一个全局变量
b. 模块内,只能被该模块使用
c. 模块内,用static声明的函数,只能用于该模块

7. typedef 和 define的区别

#define  c  char* 
typedef char* ch;

ch i,j; //此时 i,j皆为指针 
c k,l;	//此时只有K是指针 相当于 char *k,l;

8. int (p(int))[3] 是什么
下面做一些简单的分析。

int p; //这是整数型变量p

int *p; //这是整数型指针p

int *p[3]; //这是长度为3的整数型指针数组p,元素为整数型指针

int (*p)[3]; //这是一个数组指针,指向一个长度为3的整数型数组

int p(int); //这是函数声明,形参:整数型 ,返回值:整数型

    等同于 int p(int x);

int *p(int); //这是函数声明,形参:整数型 ,返回值:整数型指针

    等同于 int *p(int x);

int (*p)(int); //这是函数指针,指向有一个整数型形参和整数型返回值的函数

int (*p[3])(int);//这是函数指针数组,每个元素指向有一个整数型形参和整数型返回值的函数

int *(*p(int)); //这是函数声明,形参:整数型 ,返回值:指向整数型指针的指针

    等同于 int **p(int) , int **p(int x) , int *(*p(int x))

int *(*p(int))[3]; //这是一个函数声明,形参:整数型,返回值:一个数组指针数组,此数组内的指针,指向一个长度为3的整数型指针数组。

    我知道这个很绕,简单说返回值就是这样: int *i[x][3]; //x是任意数

9. sizeof()
返回参数的变量字节数,编译时就决定了大小,而strlen是从字符串开始到/0的长度(不包括/0),
比如,

char a[10]; 
char *p = a; 
//sizeof(a) = 10,  //数组的大小 
//sizeof ( p) = 8; //指针的大小

10. 宏定义
记得把宏定义的参数用括号括起来

11.对内存映射地址的数据进行修改

int *p = (int*)0x12345678;
*p = 2;

12. 对寄存器的某一位进行置1或者清0操作

    #define SET_BIT5  (1<<5)
    *p |= SET_BIT5;  //置1操作
    *p &= ~SET_BIT5;//置0操作

13. 无符号数和有符号类型一同计算时
当两者一起计算时,统一转换成无符号数

14. 进行字节对齐

#define PAGE_ALIGN(var)    ((((uint32)(var) + PAGE_SIZE - 1u) / PAGE_SIZE) * PAGE_SIZE)

15. #的用法
#用于编译器编译过程进行预处理。
引用至:https://blog.youkuaiyun.com/u010058695/article/details/100519877

1、宏定义
#define ON 1
#ifndef _ PARA _
#define _ PARA _
#enddef
#ifdef _ PARB _
#define DEFAULT_SIZE 1024
#enddef

2、宏开关
#if VAR

#elif

#end
3、显示设定错误
#error ERROR: Not Define
4、设置字节对齐
#pragma pack(1)

#还可以用于宏定义时转变参数为字符串,需要注意#无法再次展开,宏定义替换的时候遇到#就停止向下进一步展开,但是可以通过中间再写一个转换宏,进行替换。

e.g.1:
#define STR(str) #str char *mystr = STR(test); printf(“%s”,mystr); result: “test”

e.g.2:
#define STR(str) #str char *myits =STR(1024); printf(“%s”,myits); result: “1024”

e.g.3:
#define STR(str) #str
#define SIZE 1024 char *myint =STR(SIZE); printf(“%s”,myint); result: “SIZE” //此处输出式SIZE 因为SIZE是一个宏,不会再展开

e.g.4:
#define _STR(str) #str
#define STR(str) _STR(str)
#define SIZE 1024 char *myint =STR(SIZE); printf(“%s”,myint); result: “1024” //增加了中间层,可以正确转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值