#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++等编程语言中,双重指针通常以两个星号(
**
)来表示。下面是双重指针的一些常见用途和示例:
- 在函数中修改指针指向的内存:双重指针可以用于传递指针的指针给函数,以便在函数内修改原始指针所指向的内存。这对于修改数组、链表或动态分配的内存非常有用。
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;
}
- 动态分配内存并返回指针:双重指针可以用于在函数内部动态分配内存,并将指针传递回调用函数。
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;
}
在这两个示例中,双重指针允许我们在函数内部修改原始指针或返回新分配的内存地址,这对于处理动态数据结构和内存管理非常有用。双重指针的使用可以使函数能够修改函数外部的指针,并实现更灵活的内存操作。