项目开发日报表
项目名称 | 苏嵌实训-嵌入式Linux 第4天 |
---|---|
今日进度及任务 | 位运算、宏、编码规范、指针及编码规范 |
任务完成情况 | 课堂学习整理已完成 课后编程题已完成 |
开发中出现的问题汇总 | 无 |
未解决问题 | 三维数组学习有些困难,需要多加思考练习 |
本日开发收获 | 对编码规范有一定的学习掌握,对位运算、宏、编码规范、指针的基础学习 |
其他 | 无 |
作业
- 不同维数数组和指针数组的传参
#include "stdio.h"
void print(char *ptr); //一维数组指针
void print2(char (*ktr)[100]);//二维数组指针
void print3(char (*str)[2][100]);//三维数组指针
void print4(char **ytr);//指针数组
void print1(char *ptr)
{
printf("ptr=%s\n",ptr);
}
void print2(char (*ktr)[100])
{
for(int i=0;i<2;i++)
{
printf("ktr[%d]=%s\n",i,*(ktr+i));
}
}
void print3(char (*str)[2][100])
{
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
{
printf("str[%d][%d]=%s\n",i,j,*(*(str+i)+j));
}
}
void print4(char **ytr)
{
for(int i=0;i<3;i++)
printf("ytr[i]=%s\n",*(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;
}
结果:
课堂内容总结
1. 位运算:
操作的是无符号的数,不能默认是有符号的数
按位与运算对某些位清零或保留某些位 清零与0 保留与1 置位或1 异或取反(同为0,异为1)特定为1
-
不使用第三方变量交换变量的值
a = a^b
b = a^b
a = a^b
或
a = a+b
b=a-b
a=a-b
2. 编译预处理
-
宏变量
#define MAX 13 提高代码可读性 -
宏函数
#define MAX(a,b) (a) > (b) ? (a) : (b): -
宏函数和自定义函数的区别
宏函数:在预处理阶段做的,傻瓜式替换 。省去函数调用返回的时间,同样省去了给形参分配空间和释放。
用编译时间换内存空间和运行时间。 -
什么时候用宏函数?
频繁使用并且功能短小简单的函数 -
条件编译如果重复定义:
方法一:
#ifndef __ FUNC_H __
#define __ FUNC_H __
………………
#endif
方法二:
#pragma once
#include “func.h”
Int b=5;
3. 编码规范
-
无关块之间空行
-
for while 不管多少行都加{ }
-
变量和赋值之间加空格
…
4. 指针
- 指针是什么?
是一个变量,保存的是地址,作用:能够直接操作地址(访问硬件)
- 指针类型是根据存储的地址的类型(类型+步长)
- Int p =&n;p+1 %p取地址 跳4个字节 char 跳一个字节 %x 十六进制
- 是取值运算符 &取地址运算符
- 多维指针作用:
保存前一维指针变量的地址 - 指针赋值一定是相同类型
- 万能指针 void*
可以接受任何类型指针的值,不能做取值和运算 自加跳一个字节 - 指针减指针:等于之间有多少个此类型的数据
- 野指针:
没有给指针赋值时,会随机给他一个地址,现在新版置为空(零地址),不能直接对他操作 所以应该先分配个空间
ptr = char(*)malloc(sizeof((char)*100)
if(ptr ==NULL)
{
exit(1);//加个判断
}
free(ptr)
ptr=NULL //务必置为空 可能内存泄漏 - memset():
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s
作用是在一段内存块中填充某个给定的值,
5. 数组
-
一维数组a[i]
数组的定义及初始化
一维数组名是指针常量保存数组首元素的地址
数组地址:对数组名取地址获得的是整个数组的地址
*(&a)=a
对一维数组的地址取值等于一维数组首元素的地址 -
数组指针 int (*p)[max] =&a;
-
二维数组名:指针常量 保存一维数组地址
-
一维数组单位是元素,二维数组单位是一维数组
-
指针数组 int *p[3];
int main (int argc ,char *argv[]){}