自己实现了一个C语言例程,加深对宏、大小端、typeof宏、offsetof宏、指针变量、结构体、联合体的理解

如题所述,最近时间在复习C语言。自己实现了一个C语言例程,以加深对宏、大小端、typeof宏、offsetof宏、指针变量、结构体、联合体的理解。关于细分知识后续有空再填充…


swap宏的使用:

对应参考文章:https://editor.csdn.net/md/?articleId=108301957

  1. 对整型值进行swap, 可以通过两个异或运算解决。
#define swap_value(a, b) (a) ^= (b) ^= (a) ^=(b)

在这里插入图片描述
2. 对于绝大部分的其他类型(比如数组指针、结构体等),单纯的使用异或运算就行不通了。这时候可以使用C语言自带的__typeof()宏,GNU GCC官网详细说明:https://gcc.gnu.org/onlinedocs/gcc/Typeof.html

对应swap_type宏的定义:

#define swap_type(a, b) {\
    __typeof(a) c = (a);\
    (a) = (b);\
    (b) = (c);\
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


2. 大小端的理解:

绝大多数个人计算机都是小端机.
https://zh.wikipedia.org/wiki/字节序

附录 :例程代码
/*************************************************************************
	> File Name: 7.swap.c
	> Author: ChenXiansen 
	> Mail: 1494089474@qq.com 
	> Created Time: Mon 16 Nov 2020 10:06:31 AM CST
 ************************************************************************/

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

#define swap_value(a, b) (a) ^= (b) ^= (a) ^=(b)
#define swap_type(a, b) {\
    __typeof(a) c = (a);\
    (a) = (b);\
    (b) = (c);\
}

#define COLOR(a, b) "\033[" #b "m" a "\033[0m"
#define COLOR_HL(a, b) "\033[1;" #b "m" a "\033[0m"

#define GREEN(a)    COLOR(a, 32)
#define RED(a)      COLOR(a, 31)
#define BLUE(a)     COLOR(a, 34)
#define YELLOW(a)   COLOR(a, 33)
#define PURPLE(a)   COLOR(a, 35)

#define GREEN_HL(a)     COLOR_HL(a, 32)
#define RED_HL(a)       COLOR_HL(a, 31)
#define BLUE_HL(a)      COLOR_HL(a, 34)
#define YELLOW_HL(a)    COLOR_HL(a, 33)
#define PURPLE_HL(a)    COLOR_HL(a, 35)

typedef struct char_node {
    char a1, a2, a3, a4;
} Char_node;

typedef struct node {
    union a {
        Char_node ch_n;
        int num;
    } A;
    int number;
} Node;
#define pointer(T) typeof(T*)
#define array(T, n) typeof(T [n])

#define P_NODE(n) { \
    printf("%s \n \tA: a1 = %2x, a2= %2x, a3= %2x, a4= %2x, num = %x\n \tnumber = %d\n",\
           PURPLE(#n),\
           (n).A.ch_n.a1, \
           (n).A.ch_n.a2, \
           (n).A.ch_n.a3, \
           (n).A.ch_n.a4, \
           (n).A.num,\
           (n).number\
          );\
}

int main() {
    //swap_value 
    printf(RED(" ==== 整型值 ====\n"));
    printf(YELLOW(" -- 转换前 --\n"));
    int a_d = 4, b_d = 3;
    printf("a_d = %d b_d = %d\n", a_d, b_d);
    swap_value(a_d, b_d);
    printf(BLUE(" -- 转换后 --\n"));
    printf("a_d = %d b_d = %d\n", a_d, b_d);

    //swap_type
    //double类型的转换
    
    printf(RED("\n\n ==== 浮点数类型 ====\n"));
    printf(YELLOW(" -- 转换前 --\n"));
    double a_lf = 4.55, b_lf = 6.77;
    printf("a_lf = %lf b_lf = %lf\n", a_lf, b_lf);
    //swap_value(a_lf, b_lf); /*这里会报错,不支持对浮点数进行按位异或运算*/
    swap_type(a_lf, b_lf);
    printf(BLUE(" -- 转换后 --\n"));
    printf("a_lf = %lf b_lf = %lf\n", a_lf, b_lf);

    //字符数组指针类型的转换
    
    printf(RED("\n\n ==== 数组指针类型 ====\n"));
    printf(YELLOW(" -- 转换前 --\n"));
    char a_s[50] = {"Hello!"};
    char b_s[50] = {"Welcome to c programming!"};
    printf("a_s = %s\nb_s = %s\n", a_s, b_s);
    char *a_p = a_s, *b_p = b_s;
    swap_type(a_p, b_p);
    printf(BLUE(" -- 转换后 --\n"));
    printf("a_s = %s\nb_s = %s\n", a_p, b_p);
    
    
    printf(RED("\n\n ==== 结构体类型 ====\n"));
    printf(YELLOW(" -- 转换前 --\n"));
    //结构体类型的转换
    Node node1, node2;
    node1.A.num = 0x1234567;
    node1.number = 1;
    node2.A.num = 0x7654321;
    node2.number = 2;

    P_NODE(node1);
    P_NODE(node2);
    swap_type(node1, node2);
    printf(BLUE(" -- 转换后 --\n"));
    P_NODE(node1);
    P_NODE(node2);
    
    __typeof(Node*) node_arr[4];
    node_arr[1] = &node1;
    node_arr[2] = &node2;
    P_NODE(*node_arr[1]);
    P_NODE(*node_arr[2]);

    __typeof(__typeof(Node*)[4]) node_arr2[4];
    node_arr2[1][1] = node_arr[1];
    node_arr2[2][2] = node_arr[2];
    P_NODE(*node_arr2[1][1]);
    P_NODE(*node_arr2[2][2]);

    pointer(Node) node_p = (Node *)malloc(sizeof(Node));
    array(Node, 3) node_arr3;
    node_p = &node1;
    (*node_p).A.num = 0x8888888;
    (*node_p).number = 3;
    node_arr3[1] = (*node_p);
    P_NODE(node_arr3[1]);
    P_NODE(*node_p);
    

    // 求内存偏移量
    printf(RED_HL("\n\n ==== 内存偏移量求解 ====\n"));
    long int offset = (long int)(&(((Node *)NULL)->A.ch_n.a4));
    printf("offset: %ld\n", offset);
    long int offset2 = (long int)offsetof(Node, A.ch_n.a4);
    printf("offset2: %ld\n", offset2);

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值