项目名称 | 【苏嵌实训-嵌入式 linux C 第 4 天】 |
---|---|
今日进度以及任务 | 嵌入式C实战详解1-位运算、指针、数组和编码规范 |
本日任务完成情况 | 按时完成了老师课后布置的作业 |
本日开发中出现的问题汇总 | 无 |
本日未解决问题 | 无 |
本日开发收获 | 学习了C语言位运算、指针、数组,详细见笔记部分 |
其他 | 无 |
笔记:
一、位运算
1、位运算
& | ^ >> << ~
一定操作无符号数!!!!
按位与:运算通常用来对某些位清0或保留某些位。
按位或:常用来将源操作数某些位置1。
异或:使特定位的值取反。
2、宏函数和自定义函数区别
预处理:
缺点:不安全,容易出错。
特点:省去函数调用返回的时间,同样省去了给形参分配空间和释放。
总结:用编译时间换内存空间和运行时间。
3、常用的宏函数
__LINE__ //输出行号 %d
__func__ //输出函数名 %s
__TIME__ //显示时间
__DATE__ //显示日期
二、指针
1、指针是什么?
指针是一个变量(指针变量),保存的是地址,作用:能够直接操作地址(直接访问硬件)。
2、指针类型是根据存储的地址的类型(类型 + 步长)
3、 * 和&运算符:
* 取值运算符;&取地址。
4、多维指针的作用:
保存前一维指针变量的地址.
5、指针赋值
<一定是相同指针类型赋值>
6、万能指针:
void* :可以接收任何类型指针的值!(不能做取值和运算)
指针的运算:++ --(步长!!!!!!)
相同类型指针:指针-指针是这段指针内该类型数据的个数
7、野指针
(没有初始化的指针就是野指针)
8、用malloc申请内存注意事项:
(1)malloc申请内存有申请失败的情况,申请之后需要加一个判断语句判断是否申请内存成功。
(2)可用memset()函数初始化申请的内存空间。
(3)使用完之后需要free(ptr)释放空间,且释放之后需要重新将ptr置为空指针。
代码如下:
/*
char ptr = (char *)malloc(sizeof(char) * 100);
if(ptr == NULL)
{
printf("malloc error\n");
exit(1);
}
memset(ptr,0,sizeof(char) * 100); //初始化为0
free(ptr); //malloc用完之后要释放
ptr = NULL; //不加这行代码ptr又成野指针了,会造成内存泄漏
*/
三、数组
1、数组的定义及初始化
2、数组名的作用:
一维数组:
一维数组名:指针常量,保存数组首元素的地址。
数组地址:对数组名取地址获得整个数组的地址。
二维数组:
二维数组名:指针常量,保存的是首个一维数组的地址。
&aa:二维数组的地址
*(&aa) == aa:对二维数组的地址取值等于首个一维数组地址。
aa:二维数组的首个一维数组地址;
*aa:二维数组的首个一维数组的首元素的地址。
* ( * (aa + i) + j):
aa + i:二维数组中第 i + 1个一维数组的地址
* (aa + i):二维数组中第 i + 1个一维数组的首元素的地址
* (aa + i) + j:二维数组中第 i + 1个一维数组的第 j + 1个元素的地址
* (*(aa + i) + j):二维数组中第 i + 1个一维数组中第 j + 1个元素的值
三维数组:
三维数组名:指针常量,保存首个二维数组地址。
*aaa = 首个二维数组的首个一维数组的地址
**aaa = 首个二维数组的首个一维数组的首元素的地址
3、数组指针
4、指针数组
5、main参数:命令行参数
作业:
#include"stdio.h"
void print1(char *ptr)
{
printf("ptr = %s\n",ptr);
}
void print2(char (*ktr)[100])
{
int i;
for(i = 0; i < 2; i++)
{
printf("ktr[%d] = %s\n",i,*(ktr + i));
}
}
void print3(char (*str)[2][100])
{
int i;
int j;
for(i = 0; i < 2; i++)
{
for(j = 0; j < 2; j++)
{
printf("str[%d][%d] = %s\n",i,j,*(*(str + i) + j));
}
}
}
void print4(char **ytr)
{
int i;
for(i = 0; i < 3; i++)
{
printf("ytr[%d] = %s \n",i,*(ytr + i));
}
}
int main()
{
char ptr[100] = "hello";
char ktr[2][100] = {
"hello1","hello2"};
char str[2][2][100] = {
{
"hello3","hello4"},{
"hello5","hello6"}};
char **ytr[3]={
"a","b","c"};
print1(ptr);
print2(ktr);
print3(str);
print4(ytr);
return 0;
}