项目名称 | 【苏嵌实训-嵌入式linuxC第4天】 |
---|---|
今日进度以及任务 | 位运算、宏、编码规范、指针的学习 |
本日任务完成情况 | 根据老师教课内容练习了代码的规范编写 |
本日开发中出现的问题汇总 | 三维数组比较难 |
本日开发收获 | 对指针和数组的进一步掌握 |
其他 | 复习单链表 |
1、位运算,操作的是无符号的数,不能默认是有符号的数
-
不使用第三方变量交换变量的值:
a = a^b
b = a^b
a = a^b
或
a = a+b
b=a-b
a=a-b -
位运算的应用:
//10进制转16进制
#include"stdio.h"
#include"stdlib.h"
char *int2hex(unsigned int num)
{
char *hex=(char *)malloc(sizeof(char)*11);
int i;
unsigned int mask=0xf;
int temp;
hex[0]='0';
hex[1]='x';
hex[10]='\0';
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;
}
return hex;
}
int main()
{
unsigned int num;
char *hex;
printf("please input:\n");
scanf("%u",&num);
hex=int2hex(num);
printf("int2hex = %s\n",hex);
return 0;
}
2、预处理宏,宏函数和自定义函数的区别
- 宏函数是在预处理阶段做的,傻瓜式替换;省去了函数调用返回的时间,同样省去了给形参分配空间和释放空间
- 用编译时间换成内存空间和运行空间
4、什么样的函数需要写成宏函数?
频繁调用且功能简单的函数
5、指针、数组(内存管理)
指针
-
指针是什么指针是一个变量,保存的是地址,能够直接操作地址(直接访问硬件)
-
指针的类型是根据存储的地址的类型(类型+步长)
-
*和&运算符
*:取值运算符
&:取地址运算符 -
多维指针的作用,保存前一维指针变量的地址
-
指针的赋值:一定是相同指针类型赋值
-
万能指针:void *:可以接受任何类型指针的值(不能做取值)
-
指针-指针:这段指针内可以保存多少个数据
-
memset():
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,
数组指针:
一维数组a[i]
数组的定义及初始化
数组名的作用:是指针常量,保存的是数组首元素的地址;对数组名取地址获得的是整个数组的地址, -
*(&a) = a; 对一维数组的地址的取值等于一维数组首元素地址
二维数组aa[i][j]
二维数组名:指针常量,保存的是首个一维数组的地址,二维数组的单位是一维数组
&aa二维数组的地址
-
*(&aa)==aa:对二维数组的地址取值等于首个一维数组地址
-
aa:二维数组中首个一维数组地址
-
*aa二维数组的首个一维数组的首元素地址
-
aa+i:二维数组中第i+1个一维数组地址
-
*(aa+i):二维数组中第i+1个一维数组的首元素地址
-
*(aa+i)+j:二维数组中第i+1个一维数组的第j+1个
元素的地址 -
*( *(aa+i)+j):二维数组中第i+1个一维数组的第j+1个元素的值
三维数组aaa[i][j][k]
指针数组:
主函数main的参数
命令行参数
atoi:把字符串转为整型
作业:
#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;
}