数组,指针-苏嵌嵌入式linux C实训 第4天

项目开发日报表

项目名称 苏嵌实训-嵌入式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;
} 

结果:
数组,指针-苏嵌嵌入式linux C实训 第4天_第1张图片

课堂内容总结

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[]){}

你可能感兴趣的:(物联网工程实训)