叶圣民//函数指针数组的使用练习//复合数据结构的使用练习//2018.07.23.

   学习日志        姓名:叶圣民   日期:2018.07.23.

 

 

 

 

今日学习任务

 

1、熟练掌握所有关键字的使用;staticexterntypedef

2、熟练掌握复合数据类型的使用;struct、unionenum

3、编程技巧总结;

日任务完成情况

 

(详细说明本日任务是否按计划完成,开发的代码量)

关键字:

  1. register:寄存器变量:请求编译器将变量尽可能的保存在CPU的内部寄存器中;省去CPU从内存中抓取数据的时间,提高执行效率;经常被访问的变量可以用register修饰;

    register注意事项:只能修饰局部变量,不能修饰全局变量和函数;

    不能对被修饰的变量取地址;因为改变量保存在CPU内部寄存器中无法在内存中读取地址

  1. static:既能修饰全局变量,局部变量也能修饰函数

      可用于修改局部变量的生命周期(使用范围)(延长至整个函数执行完毕)

    减少使用全局变量:①全局变量代码危险

                      ②全局变量被共享后会数据紊乱

    static修饰的全局变量(或函数)只能在本文件中使用不能在其他文件中使用

  1. extern:外部声明

          声明该变量(函数)是在其他文件中定义,若使用需要到其他文件中寻找定义

  1. const:只读变量(变量空间可改变,但不可以使用该变量名改      变);不可通过被修饰的变量名改变该内存空间的值;

注意事项:①修饰变量要初始化;

          ②离得近的被修饰;不能改变

              ③在定义函数的时候使用,防止该函数修改了原始数据

  1. typedef:给类型重起名字,提高代码的移植性
  2. 基本类型:int  char  int *   char *

   复合数据类型:数组  结构体  共用体(联合体) 枚举

  1. 结构体:struct  message

           {

int  num;

char  ch;

}msg;

          typedef  struct message Messgae;

          Message * p_msg = &msg;//*p_msg = msg

          P_msg->num = 5;

    

     内存空洞:由于对齐方式导致的(32位系统下的最大对齐字节是4个字节);可以设置编译器的最大对齐方式

 

     作用:封装数据(打包数据)

 

  1. 宏(#define)

    为避免 幻数 ,把无法字自注释的数字宏替换

     当 幻数 有很多,都需要宏替换的时候用 枚举;

宏函数:例 #define MAX(a,b) a > b ? a : b

简短且频繁被调用的函数可用宏替换;

 

 

 

 

 

 

 今日开发中出现的问题汇总

 

  1. #define VS typedef

2、continue VS break

 

日未解决问题

 

函数指针数组使用的练习(简单计算器)

​
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


double add(double a,double b)
{
    return a + b;
}

double sub(double a,double b)
{
    return a - b;
}

double mul(double a,double b)
{
    return a * b;
}

double div(double a,double b)
{
    return a / b;
}


double cal(double a,double b,double (*p_cal)(double,double))
{
    return p_cal(a,b);
}


int main()
{
    int i = 0;
    
    double (*p_cal_array[4])(double,double);
    p_cal_array[0] = add;
    p_cal_array[1] = sub;
    p_cal_array[2] = mul;
    p_cal_array[3] = div;

    printf("*p_cal_array\n");
    for(i = 0;i < 4;i++)
    {
        printf("result[%d] = %0.2lf\n",i,(*p_cal_array[i])(2,3));
    }

    printf("*p_cal\n");
    printf("add = %0.2lf\n",cal(2,3,add));
    printf("sub = %0.2lf\n",cal(2,3,sub));
    printf("mul = %0.2lf\n",cal(2,3,mul));
    printf("div = %0.2lf\n",cal(2,3,div));

    return 0;
}


​

 

struct学习

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct message
{
    int num;
    char ch;
    char ptr[100];
};

typedef struct message Message;

int main()
{
    Message msg;

    Message * p_msg = &msg;

    msg.num = 2;
    (*p_msg).num = 1;

    msg.ch = 'c';
    
    //msg.ptr = "hello world";//错误
    //msg.ptr = (char *)malloc(sizeof(char) * 100);
    strcpy(p_msg->ptr,"hello world");

    printf("msg.num = %d\n",msg.num);
    printf("msg.ch = %c\n",msg.ch);
    printf("msg.ptr = %s\n",msg.ptr);
    
    return 0;
}



 

用共用体判断CPU 是 大端字节序 还是 小端字节序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


union node
{
    //int num;
    char ch1;
    char ch2;
    int num;
};

typedef union node Node;

int main()
{
    Node p;
    
    p.num = 0x12345678;

    if(p.ch1 == 0x78)
    {
        printf("小端字节序\n");
    }

    if(p.ch1 == 0x12)
    {
        printf("大端字节序\n");
    }

    printf("sizeof(p) = %d\n",sizeof(p));
    
    return 0;
}

 

 

1024

猜你喜欢

转载自blog.csdn.net/qq_31421117/article/details/81172033