工程实践实训日报四

工程实践实训日报四

项目名称 【苏嵌实训-嵌入式 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. 代码的可读性:自注释性

  2. 宏函数和自定义函数的区别

    ​ 编译时间换运行时间和内存空间

  3. 什么时候适合使用宏函数

    ​ 常用的功能短小简单的函数

  4. 解决头文件重复定义的问题

    ​ (1) 条件编译

    #ifndef __FUNC_H__
    #define __FUNC_H__
    
    //func.h的内容
    int a = 5;
    
    #endif
    

    ​ (2) 预处理指令

    ​ #pragma once

  5. 具体编码规范见群文件《华为编码规范和范例》

4. 指针

1.指针是什么?

​ 指针是一个变量(指针变量),保存的是地址,能够直接操作地址(意味着可直接访问硬件)

  1. 指针类型是根据存储的地址的类型(类型+步长)

  2. 指针运算符:*(取值) &(取地址)

  3. 多维指针的作用:保存前一维指针变量的地址

  4. 指针赋值 (一定是相同指针类型复制)

  5. 万能指针:void *,可接收任何类型指针的值(不能做取值和运算)

  6. 野指针(未初始化的指针:新版为NULL,老版为随机值)

注意:指针使用完要释放置空,防止内存泄漏、段错误等。

5. 数组
  1. C99之后定义数组int a[n]后不会报错,但不建议使用

  2. 一维数组名:指针常量,保存数组首元素的地址

    数组地址:对数组名取地址获得整个数组地址

    //举例
    int a[3];
    (a + 1)		//指向的是4个字节后的地址
    (&a + 1)	//指向的是12个字节后的地址
    *(&a) = a;		//对一维数组地址的取值等于一维数组首元素地址
    
    int (*pa)[3] = &a;		//pa
    
  3. 二维数组名:指针常量,保存的是首个一维数组的地址

    一维数组单位是元素,二维数组单位是一维数组…

    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;
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值