【苏嵌实训-嵌入式 linux C 第 4 天】

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

【苏嵌实训-嵌入式 linux C 第 4 天】_第1张图片

你可能感兴趣的:(苏嵌实训)