首页 > 代码库 > 嵌入式驱动工程师培训笔记(三)

嵌入式驱动工程师培训笔记(三)

一:系统中内存的结构

4g 起始地址为bfffffff

3g 起始地址为7fffffff

2g 起始地址为3fffffff

1g 起始地址为00000000

上图所示,虚拟内存为4g,操作系统规定应用程序只能在前3g ,后面1g是操作系统使用。涉及到内核编程时使用。

二:指针和数组介绍:

     指针需要了解的是 指针的类型  指针所指向的类型 指针的值或者说是指针所指向的内存区,还有指针本身所占据的内存区

    & 取地址符号 , * 解地址。

    数组名为数组的首地址。

三:C数据类型

  1.基本数据类型  int char long  ...

  2.结合   [ ]  * 不能单独使用

  3.自定义: struct  union ...

四 :上课练习编程题目:

1.

#include<stdio.h>int main(){        int i = 10;        int *p = &i;        int** k = &p;        printf("i 的地址为%p \n",&i);        printf("i 的地址的值为%d \n",*(&i));        printf("i 的地址为%p \n",p);        printf("i 的地址的值为%d \n",*p);        printf("p 的地址为%p \n ",&p);        printf(" p 的地址里的值为%p\n",*(&p));        printf(" p 的地址里的值为%p\n",*k);        printf("k 的地址为i%p\n",&k);}

 

通过上面的程序 ,了解&和*的功能。   分析 可知  p是指针变量 , 用来存放i的地址。p本身也占据内存 。

2.

#include<stdio.h>int hello(int *p){        printf("*p is %d\n",*p);        *p = 100;}int main(){        int i = 10;        hello(&i);        printf("i is %d\n",i);}~ 
子函数使用指针变量参数

 在子函数中,使用传指针变量来改变主函数中的值。

3.

#include<stdio.h>int swap(int *a,int *b);int swap2(int *a ,int *b);int swap3(int *a,int *b);int main(){        int a = 5;        int b = 6;        swap(&a,&b);        printf("a=%d,b=%d\n",a,b);        swap2(&a,&b);        printf("a=%d,b=%d\n",a,b);        swap3(&a,&b);        printf("a=%d,b=%d\n",a,b);}int swap(int *a, int *b){        int temp=0 ;        temp = *a;      *a = *b;        *b = temp;}int swap2(int *a ,int *b){        *a = *a + *b;        *b = *a -*b;        *a = *a - *b;}int swap3(int *a ,int *b ){        *a = *a ^ *b;        *b = *a ^ *b;        *a = *a  ^ *b;}
使用子函数交换值

 

交换两个数的值有三种方式,使用中间变量,使用加减 ,使用位运算,要注意的是,使用加减时要注意数值溢出

4.

#include<stdio.h>int main(){        int i = 654;        printf("%d", printf("%d",printf("%d",i)));}

 

遇到无从下手时,可以查看函数的手册   通过 man 3 printf  查看可知 ,printf返回的是输出的字符个数(\o 不算)

 所以最后输出的结果是 65431

5 .给定一个数值 判断是一年中的几月几日 忽略闰年 

 

#include<stdio.h>int showmd(int n);int main(){        int mouth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};        int m = 12;        int d = 31;        int days = 0;        int i ;        for(i=0;i<m-1;i++)        {                days += *(mouth+i);        }        printf("days is %d\n",days+d);        showmd(days+d);}int showmd(int n){        int i;        int j;        int mouth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};        int days = 0;        for(i=0;i<12;i++)        {                days += *(mouth+ i);                if(days >= n)                        {                                j = days -n ;                                printf("月份为%d,日期为%d\n",i+1,*(mouth+i)-j);                                break;                        }        }}"test.c" 43L, 547C                                            1,1           Top
判断年月

 

6.

#include<stdio.h>int main(){        int n;        int i;        for(i=0;i<120;i++)        {                if(i%7==0)                {                        if((i%2==1)&&(i%3==2)&&(i%4==3)&&(i%5==4)&&(i%6==5))                                printf("%d\n",i);                }        }}~  
爱因斯坦阶梯数

 7.

#include<stdio.h>int main(){        int i,j,sum;        for(i=2;i<1000;i++)        {                sum = 0;                for(j=1;j<i;j++)                        if(i%j == 0)                                sum +=j;                        if(sum == i)                                printf("完全数为%d\n",i);        }}
完全数

 

嵌入式驱动工程师培训笔记(三)