指针的指针操作结构体数据、双重指针

#include "stdio.h"
struct t
{
	unsigned char test[5];
} ;

void test(struct t **p)
{
	(*p)->test[0] = 5;
}
 
int main()
{
 	unsigned char qwe;
 	struct t *x;
 	struct t y;
 	x = &y;
 	test(&x);
 	for(int i = 0;i < 5;i++)
 	{
 		printf("%d ",y.test[i]);
	 }
 	return 0;
}
 
其中x = &y,x指向了y的地址,p = &x,p指向了x的地址,也就是p指向了指针的地址
其中想通过p改变y的数据,就是需要(*p)->test[0] = 5;括号是必须需要的,不然会报错

        使用指向指针的指针(双重指针)操作结构体数据时,你可以通过双重指针访问和修改结构体的成员变量。这对于在函数中修改传递给函数的结构体参数非常有用,因为通过双重指针可以改变原始结构体的内容。以下是一个示例:

#include <stdio.h>

// 定义一个结构体
struct Person {
    char name[50];
    int age;
};

// 修改结构体数据的函数,使用双重指针
void modifyPerson(struct Person **personPtr) {
    // 通过双重指针访问结构体成员
    (*personPtr)->age = 30;
    // 注意:name成员是字符数组,可以通过strcpy等函数修改
    strcpy((*personPtr)->name, "John Doe");
}

int main() {
    // 创建一个结构体实例
    struct Person person1;
    
    // 创建一个指向结构体的指针
    struct Person *ptr = &person1;

    // 创建一个指向指针的指针
    struct Person **ptrPtr = &ptr;

    // 修改结构体数据
    modifyPerson(ptrPtr);

    // 访问和打印修改后的结构体数据
    printf("Name: %s\n", person1.name);
    printf("Age: %d\n", person1.age);

    return 0;
}

        在上面的示例中,我们首先创建了一个结构体Person和一个指向结构体的指针ptr。然后,我们创建一个指向指针的指针ptrPtr,它指向ptr

        在modifyPerson函数中,我们通过双重指针personPtr来访问和修改传递给函数的结构体数据。请注意,使用(*personPtr)来访问结构体指针,然后通过->运算符来访问结构体的成员变量。

        通过双重指针,你可以在函数内部修改原始结构体的内容,而无需返回任何值。这对于在函数中修改结构体等复杂数据结构非常有用。

        双重指针(Double Pointer)是指一个指针变量,它存储的是另一个指针变量的地址。双重指针通常用于在函数中修改指针指向的内存地址,或者动态分配内存并将指针传递回调用函数。在C和C++等编程语言中,双重指针通常以两个星号(**)来表示。

下面是双重指针的一些常见用途和示例:

  1. 在函数中修改指针指向的内存:双重指针可以用于传递指针的指针给函数,以便在函数内修改原始指针所指向的内存。这对于修改数组、链表或动态分配的内存非常有用。
void modifyPointerValue(int **ptrPtr) {
    int newValue = 42;
    *ptrPtr = &newValue; // 修改原始指针的指向
}

int main() {
    int value = 10;
    int *ptr = &value;
    
    // 传递指针的指针,修改原始指针的指向
    modifyPointerValue(&ptr);
    
    printf("Value: %d\n", *ptr); // 输出 42
    return 0;
}
  1. 动态分配内存并返回指针:双重指针可以用于在函数内部动态分配内存,并将指针传递回调用函数。
void allocateMemory(int **ptrPtr) {
    int *newMemory = (int *)malloc(sizeof(int));
    *newMemory = 100;
    *ptrPtr = newMemory; // 将新分配的内存地址传递给原始指针
}

int main() {
    int *ptr = NULL;
    
    // 在函数内部动态分配内存,并将指针传递回调用函数
    allocateMemory(&ptr);
    
    printf("Value: %d\n", *ptr); // 输出 100
    
    // 记得释放分配的内存
    free(ptr);
    
    return 0;
}

        在这两个示例中,双重指针允许我们在函数内部修改原始指针或返回新分配的内存地址,这对于处理动态数据结构和内存管理非常有用。双重指针的使用可以使函数能够修改函数外部的指针,并实现更灵活的内存操作。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

浮若于心

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

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

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

打赏作者

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

抵扣说明:

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

余额充值