指针的自加和结构体中共同体数据调用

本文介绍了C/C++编程中如何在结构体中定义共用体,创建更复杂的数据结构,以及如何利用指针自增操作遍历数据。示例展示了如何在结构体中使用共用体存储不同数据类型,并通过指针自增访问和操作这些数据。此外,还解释了指针自增在遍历数组和链表中的应用。
摘要由CSDN通过智能技术生成
结构体中共同体数据调用:
#include "stdio.h"

typedef struct mm_route_buf_env
{
    unsigned char opcode;
    unsigned char info;
    union
    {
        unsigned char src;
        unsigned char dst;
    } u_addr;
    unsigned char app_key_lid;
    unsigned char mdl_lid;
} mm_route_buf_env_t;

int main()
{
	mm_route_buf_env_t x,*q;
	q = &x;
	x.u_addr.dst = 1;
	printf("%d",q->u_addr.dst);
	return 0;
}

在C和C++中,你可以在结构体(struct)中定义共用体(union),以创建更复杂的数据结构。这种结构被称为嵌套结构,允许你在结构体中包含多个共用体,以便根据需要选择其中一个共用体来存储数据。以下是一个示例:

#include <stdio.h>

// 定义一个共用体
union Data {
    int integer;
    double decimal;
    char text[20];
};

// 定义一个结构体,包含两个共用体
struct ComplexData {
    int type;        // 用于标识当前使用的共用体
    union Data data; // 共用体成员
};

int main() {
    // 创建一个结构体实例
    struct ComplexData person;

    // 设置类型标识和共用体成员
    person.type = 1;       // 1表示整数
    person.data.integer = 42;

    // 打印共用体数据
    if (person.type == 1) {
        printf("Integer: %d\n", person.data.integer);
    } else if (person.type == 2) {
        printf("Decimal: %f\n", person.data.decimal);
    } else {
        printf("Text: %s\n", person.data.text);
    }

    return 0;
}

在上面的示例中,我们定义了一个包含两个共用体的结构体ComplexDataComplexData结构体包含一个整数类型的type成员,用于标识当前使用的共用体。根据type的值,我们可以选择存储整数、浮点数或文本数据。

通过嵌套结构体和共用体,你可以创建更灵活的数据结构,以存储不同类型的数据,并根据需要访问它们。这在处理复杂的数据或数据包格式时非常有用。但要确保在访问共用体数据时始终知道正确的类型标识,以避免数据类型不匹配的问题。

指针的自加
#include "stdio.h"

int main()
{
	int a[] = {1,2,3,4,5};
	int *p = a;
	int x = *++p + (*++p);
	printf("%d",x);
	return 0;
} 
结果为 5,可用于使用指针指向一段地址时可对地址中的多个数据进行同时操作

指针的自增操作是指将指针变量指向的内存地址增加(或减少,如果是自减)一个特定的偏移量,以使指针指向下一个(或前一个)存储单元。这通常用于遍历数组、链表或其他数据结构中的元素。

在C和C++等编程语言中,指针的自增通常通过使用++运算符来执行。以下是一些示例:

  1. 递增指向整数数组元素的指针
int numbers[] = {1, 2, 3, 4, 5};
int *ptr = numbers; // 将指针指向数组的第一个元素

// 使用自增操作遍历数组
for (int i = 0; i < 5; i++) {
    printf("%d ", *ptr);
    ptr++; // 将指针指向下一个数组元素
}

在上面的示例中,ptr是一个指向整数的指针,通过不断执行ptr++来遍历整数数组中的元素。

  1. 递增指向结构体链表节点的指针
#include <stdio.h>

struct Node {
    int data;
    struct Node *next;
};

int main() {
    struct Node node1 = {1, NULL};
    struct Node node2 = {2, NULL};
    struct Node node3 = {3, NULL};

    node1.next = &node2;
    node2.next = &node3;

    struct Node *current = &node1;

    // 遍历链表
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next; // 将指针指向下一个节点
    }

    return 0;
}

在上面的示例中,current是一个指向链表节点的指针,通过不断执行current = current->next来遍历链表中的节点。

指针的自增和自减操作是在C和C++等低级编程语言中非常常见和有用的操作,但要谨慎使用,以避免访问未分配或越界的内存,导致程序错误。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮若于心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值