C language foundation (9)

struct function

The function cannot be called in the structure, the function pointer needs to be declared

#include<stdio.h>

typedef int (*p_func)(int a, int b);
//C++里面面向对象,多态

int add(int a, int b)
{
    return a + b;
}
//结构体各成员默认是public
//class在C++里,是一个类,所有成员和方法(函数)是si(private)有的,只能在类里进行访问
//struct里面不能包含函数,但是可以包含函数指针
struct data
{
    int a;
    int b;
    p_func p;//函数指针
    //不能有函数
//  int add(int a, int b);
}s;

//填充结构体
void set_func(struct data *p)
{
        p->a = 2;
        p->b = 3;
        p->p = add;
}
//业务函数
int cnt_func(struct data *p_str)
{
    return p_str->p(p_str->a, p_str->b);
}
int main(void)
{
    set_func(&s);
    int ret = cnt_func(&s);
    printf("ret = %d.\n", ret);
    return 0;
}

network structure

Mainstream or ipv4
header file path: /usr/include/netinet/in.h
needs to use the header file

#include <stdio.h>
#include <features.h>
#include <stdint.h>
#include <sys/socket.h>
#include <bits/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

Header file content:

/* Internet address.  */
typedef uint32_t in_addr_t;
typedef uint16_t in_port_t;    // 16的无符号short类型 
struct in_addr
{
    in_addr_t s_addr;
};

/* Structure describing an Internet socket address.  */
struct sockaddr_in
{
    __SOCKADDR_COMMON (sin_);   /* AF_INET IPv4 Internet protocols  指定网络地址类型*/ 
    in_port_t sin_port;         /* Port number. 端口号 16位无符号short */
    struct in_addr sin_addr;    /* Internet address.  具体的网址32位无符号int*/

    /* Pad to size of `struct sockaddr'.  */
    unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr)];
};

Define the structure sockaddr_in and assign a value

#define PORT 0x1234
#define ADDR "19.16.1.22"
//把本地ip地址转换成网络字节序地址
//in_addr_t inet_addr(const char *cp);
//输出型参数干的事儿

void set_net_struct(struct sockaddr_in *p)
{
    p->sin_family = AF_INET;
    p->sin_port = htons(PORT);
    p->sin_addr.s_addr = inet_addr(ADDR);
}

int main(void)
{
    struct sockaddr_in s;
    //赋值
    set_net_struct(&s);
    printf("网络字节序地址:0x%x.\n", s.sin_addr.s_addr);
    return 0
}

flexible array

In the structure, there is an array, which must be the last element of the structure, and it has a specific form [] or [0], that is, the last element of the structure must be an array with no defined size, which requires malloc to dynamically apply for an array Use after size The
overall structure has at least two member variables.

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

typedef struct
{
        int len;
        int arr[];
}S;
// 看一下,遍历
void show_infor(S *p)
{
    int i = 0;
//  printf("p->arr[%d] = %d.\n", p->len-1, p->arr[p->len-1]);
    //遍历所有元素
    for (i=0; i<p->len; i++)
    {
            printf("p->arr[%d] = %d.\n", i, p->arr[i]);
    }
}


//生成柔性数组
void create_soft_arr(int len)
{
    S *p = (S *)malloc(sizeof(S) + sizeof(int)*len);
    //让a成员控制我数组个数
    p->len = len;

    int i = 0;

    for (i=0; i<len; i++)
    {
        if (i <= 1)
                p->arr[i] = 1;
        else if (i >= 2)
            p->arr[i] = p->arr[i-1] + p->arr[i-2];
    }

    //看一下 用func
    show_infor(p);

    free(p);
}




int main(void)
{       
    create_soft_arr(10);
    int len = 10;

    printf("sizeof(S) = %d.\n", sizeof(S));   // 4
    //动态数组生成
    //.符号:结构体变量访问各成员.
    S *p = (S *)malloc(sizeof(S) + sizeof(int)*len);
    //判断空间申请情况,和清0操作,省略
    //数组赋值
    int i = 0;

    for (i=0; i<len; i++)
    {
        //p->arr得到的是数组名
        p->arr[i] = i+1;
//      (*p).arr[i] = i+1;
    }
//看一下
    for (i=0; i<len; i++)
    {
        printf("p->arr[%d] = %d.\n", i, p->arr[i]);
    }

    return 0;
}

enumerate

Enumeration: Define constant symbols, which is a collection of macro-defined constants. For
example : four seasons, weeks, and constants related to meaning.
State machine: 1. According to the current state, when this cycle ends, it becomes the next state.
2. According to your current state, it is also related to your input. For example: fpga, GUI (graphical user interface)
implementation: password lock

#include <stdio.h>

#define NU1 10
#define NU2 10
//里面成员必须大写
typedef enum  fangxiang                         // 标识符
{
    EAST,
    WEST = 99,
    SAUTH,
    NORTH = 100,
    xq,
}E;
//定义状态机的所有状态集
typedef enum STATE
{
    STATE1,
    STATE2,
    STATE3,
    STATE4,
    STATE5,
    STATE6,
    STATE7,
}S;

int main(void)
{
    int num = 0;
    //1、密码锁初始状态
    S current_state = STATE1;
    // 输入密码,进行解锁
    printf("输入一个密码数字:");
    while (1)
    {
        scanf("%d", &num);
        printf("num = %d.\n", num);
        //解锁子开始
        switch (current_state)
        {
            case STATE1:
            if (num == 9)                   
            {
                current_state = STATE2; // 用户每输对一次,进入下一状态
            }
            else
            {
                current_state = STATE1;
            }
            break;
            case STATE2:
            if (num == 5)
            {
                current_state = STATE3;  // 用户每输对一次,进入下一状态
            }
            else
            {
                current_state = STATE1;
            }
            break;

            case STATE3:
            if (num == 2)
            {
                current_state = STATE4; // 用户每输对一次,进入下一状态
            }
            else
            {
                current_state = STATE1;
            }
            break;

            case STATE4:
            if (num == 7)
            {
                current_state = STATE5;  // 用户每输对一次,进入下一状态
            }
            else
            {
                current_state = STATE1;
            }
            break;

            default:
            current_state = STATE1;
            break;      
        }
            if (current_state == STATE5)
            {
                printf("开了锁,请进!.\n");
                //break
                return 0;
            }
            if (current_state == STATE1)
            {
                printf("初始状态.\n");
            }
    }
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325919940&siteId=291194637