工程实践实训日报四
项目名称 【苏嵌实训-嵌入式 linux C 第 4天】
今日进度以及任务 今天主要跟老师后面回顾了位运算、整型转进制、指针、数组和编程中应当要注意的编码规范。
本日任务完成情况 基本完成了相关知识点的回顾,代码量还行,可以接受。
本日开发中出现的问题汇总 对指针的指针之类二级指针问题认识不是很清楚。
本日未解决问题 无
本日开发收获 在本次学习中掌握了头文件重复定义的问题,以前编程的时候碰到这种问题不知道怎么解决,只是通过其他方法去规避,不能有效解决这类问题。
其他 个人感觉编程的学习是一个长期累积的过程,需要不断去练习,编程中有很多小的细节方面需要注意,单纯理论记忆很容易忘,自己动手去敲,去运行,遇到问题自己去解决才是成长最快的方法。
笔记
1. 位运算
& | ^ << >> ~
2. 整型转进制
#include <stdio.h>
#include <stdlib.h>
void int2other(int x, int p)
{
int a[100]; //存放余数
int count=0;
do{
a[count++]=x%p;
x=x/p;
}while(x!=0);//当商不为0时进行循环
printf("Result: ");
for(int i=count-1;i>=0;i--){
printf("%d",a[i]);
}
printf("\n");
}
char * int2hex(unsigned int num)
{
//static char hex[11] = 0;
char *hex = (char *)malloc(sizeof(char) * 11);
hex[0] = '0';
hex[1] = 'x';
hex[10] = '\0';
int i,temp;
unsigned int mask = 0xf; //掩码
for(i = 0; i < 8; i++)
{
temp = num & mask;
if(temp >= 10)
{
hex[9-i] = temp - 10 + 'a';
}
else
{
hex[9-i] = temp + '0';
}
num = num >> 4;
}
printf("Result: %s\n",hex);
}
int main()
{
int x,p;
printf("Input the num:\n");
scanf("%d",&x);
printf("Input the format size:\n");
scanf("%d",&p);
int2other(x, p); //转10以下的进制
int2hex(x); //转16进制
return 0;
}
3. 编码规范
-
代码的可读性:自注释性
-
宏函数和自定义函数的区别
编译时间换运行时间和内存空间
-
什么时候适合使用宏函数
常用的功能短小简单的函数
-
解决头文件重复定义的问题
(1) 条件编译
#ifndef __FUNC_H__ #define __FUNC_H__ //func.h的内容 int a = 5; #endif
(2) 预处理指令
#pragma once
-
具体编码规范见群文件《华为编码规范和范例》
4. 指针
1.指针是什么?
指针是一个变量(指针变量),保存的是地址,能够直接操作地址(意味着可直接访问硬件)
-
指针类型是根据存储的地址的类型(类型+步长)
-
指针运算符:*(取值) &(取地址)
-
多维指针的作用:保存前一维指针变量的地址
-
指针赋值 (一定是相同指针类型复制)
-
万能指针:void *,可接收任何类型指针的值(不能做取值和运算)
-
野指针(未初始化的指针:新版为NULL,老版为随机值)
注意:指针使用完要释放置空,防止内存泄漏、段错误等。
5. 数组
-
C99之后定义数组int a[n]后不会报错,但不建议使用
-
一维数组名:指针常量,保存数组首元素的地址
数组地址:对数组名取地址获得整个数组地址
//举例 int a[3]; (a + 1) //指向的是4个字节后的地址 (&a + 1) //指向的是12个字节后的地址 *(&a) = a; //对一维数组地址的取值等于一维数组首元素地址 int (*pa)[3] = &a; //pa
-
二维数组名:指针常量,保存的是首个一维数组的地址
一维数组单位是元素,二维数组单位是一维数组…
int main() { int aa[2][2]; int i; int j; for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { //不同的赋值方式 //scanf("%d", &aa[i][j]); scanf("%d", *(aa + i) + j); } } for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { printf("%d\n", aa[i][j]); } } return 0; }