电商专业学习嵌入式软件开发第二十一天

  • 预科第十天

今天老师讲的是指针,老师在讲的时候单个例子都能明白,但是一旦不讲就感觉脑袋发懵,不清楚哪儿有问题。好像是设定好的程序,只要一到数组指针函数这一块儿就感觉脑袋内存不够用,总会当机。

25.指针

1>指针:实际上就是地址
2>怎么定义指针:
下面就需要定义一个变量来存储整型变量的地址,

    /*先算*符号,表明p不是一个普通(int,char,float,double)的变量,而是一个地址变量,再算前面的int,代表将来这个p是存储的int类型变量的地址,而不是其他类型变量的地址
     */
    int i=1;//定义整型变量,就应该在内存当中分配好了空间,地址就应该固定不变
    int *p=&i;//int *p=0xfff
    //*的用法:*变量名:*是去取地址所对应的存储单元里面的值
    
    printf("i=%d\n",*p);
    *p=9;//*(&i)=====>i=9
    printf("i=%d\n",i);
    printf("%p\n",&i);
    printf("%p\n",p);
    printf("%p\n",&p);

const:常量

    /*const修饰变量,代表将来这个变量将来的只读,不能被更改,
     注意点:const修饰的变量一定要在初始化的时候给定初值,因为将来不能被再次赋值
     */
    const int  a=7;
    //int const a=7;
    printf("%d",a);

    int a=7;
     const int *p=&a;const写在前面代表将来不能通过p去间接的更改a的值
     int const *p=&a;const写在int后面代表将来不能通过p去间接的更改a的值
     int  * const p=&a;const写在*后面代表将来p这个变量的值只读
     const int * const p=&a;const这样写代表啥都不能改

多级指针
二级指针:二级指针里面的值就是一级地址变量的地址

    int a;
    int *p=&a; //一级指针
    int **p1=&p; //二级指针
    int ***p2=&p1; //三级指针
#include
int main()
{
    int a,b;
    int *p=&a;
    int *q=&a;
    if(p==q)
    {
        printf("====\n");
    }
    return 0;
}

struct是创造出来一个特殊的类型,系统中没有这个类型
格式:
struct 结构体名称
{
结构体的相关属性;
};

// 学生:分数、学号
    struct Student
    {
        float score;
        int num;
    };
    //数据类型+变量名;
    //变量的定义,.在C语言当中相当于‘的’
    struct Student stu;
    //3.初始化:'.'
    stu.score=18.7;
    stu.num=9; 
    //1.初始化:
    struct Student stu1={12.5,1};
    //2.初始化:
    struct Student stu2=stu1;
    printf("stu2={score=%f,num=%d}\n",stu2.score,stu2.num);
struct Birthday
    {
        int year;
        int month;
        int day;
    };
    struct Person
    {
        char sex;
        int age;
        struct Birthday birthday;
    };
    struct Person p1={'m',20,{2000,1,1}};
    struct Person p2;
    p2.age=18;
    p2.sex='f';
    p2.birthday.year=1990;
    p2.birthday.month=1;
    p2.birthday.day=1;
    struct Person p3=p2;

字节对齐
1>如果是基本数据类型(int,char,float,double);第一个成员属性从偏移量为0处分配,以后的成员属性是从他本身字节数的最小倍数开始分配
2>如果不是基本数据类型,是集合类型,数组,结构体,比如里面有一个成员属性是结构体类型,struct X{ int a;char ch;double f;};是从他的成员属性里面最大的字节数的最小倍数开始分配

3>最后收尾的时候,整个字节数要是最大成员属性字节数的最小倍数

/*
     int:4
     char:1
     float:4
     double:8
     */
    struct A
    {
        char ch;//0  char第一个成员属性从偏移量为0处分配,char为1字节,记为0;
        int m;//4--7  int从本身字节数的最小倍数开始;
        char ch1;//8  char类型只有1个字节,+1;
        double i;//16--23 double从本身字节数的最小倍数开始,从9开始,找8的最小倍数;
    };//24  从0-23有24个字节
    printf("%ld\n",sizeof(struct A));//struct A为24字节,32位机器得出的是20;
    struct B
    {
        int i;//0--3  int第一个成员属性从偏移量为0处分配,int类型4字节,0-3为4字节;
        struct A a;//8--31  从struct A的成员属性里面最大的字节数double的最小倍数开始,struct A有24字节,double有8字节,从3开始找8的倍数,数够24位;
        char ch;//32  char类型只有1个字节,+1;
        float m;//36--39   float从本身字节数的最小倍数开始;从33开始找4的倍数,float有4字节;
    };
    printf("%ld\n",sizeof(struct B));//struct B为40字节,32位机器得出的是32;
面试时遇到类似题目需要问清楚是在32位还是64位机器上运行。

你可能感兴趣的:(电商专业学习嵌入式软件开发第二十一天)