函数形参列表传一级指针是为了修改作用域外 取地址的数据。
传二级指针是为了修改作用域外 取地址的一级指针。
解释:
让我们分解一下:
传一级指针(指向某个数据):通常用于修改函数外部作用域中的数据。通过传递指向某个数据的指针,函数可以修改该数据的值,因为它具有对数据的引用。这种情况下,函数可以修改指针所指向的数据,但不能修改指针本身。
传二级指针(指向指针的指针):在某些情况下,需要修改函数外部作用域中的指针本身,而不仅仅是指针所指向的数据。这时就需要传递指向指针的指针,也就是二级指针。函数通过这种方式可以修改指针的值,进而改变指针所指向的地址或者修改指针所指向的指针。这种情况通常用于需要动态分配内存或者修改指针本身的情况。
因此,传递一级指针用于修改指针所指向的数据,而传递二级指针则可以修改指针本身,进而影响到指针所指向的数据。
这两种分别用C代码举例
首先,让我们看看如何通过传递一级指针来修改函数外部作用域中的数据:
#include <stdio.h>
// 通过传递一级指针修改函数外部的数据
void modifyValue(int *ptr) {
*ptr = 20; // 修改指针所指向的数据
}
int main() {
int num = 10;
printf("Before modification: %d\n", num);
modifyValue(&num); // 传递指向num的指针
printf("After modification: %d\n", num);
return 0;
}
在这个例子中,modifyValue
函数接收一个指向整数的指针,并将其值修改为 20。在 main
函数中,我们声明了一个整数变量 num
,并将其值初始化为 10。然后,我们通过传递 &num
(即指向 num
的指针)来调用 modifyValue
函数。在函数内部,通过解引用指针 *ptr
,我们可以修改 num
的值。
现在,让我们看看如何通过传递二级指针来修改指针本身,进而影响到指针所指向的数据:
#include <stdio.h>
#include <stdlib.h>
// 通过传递二级指针修改指针本身,进而影响到指针所指向的数据
void modifyPointer(int **ptr) {
int *temp = (int *)malloc(sizeof(int));
*temp = 30;
*ptr = temp; // 修改指针本身,使其指向新的内存地址
}
int main() {
int *numPtr = NULL;
printf("Before modification: %p\n", (void *)numPtr);
modifyPointer(&numPtr); // 传递指向指针的指针
printf("After modification: %p, Value: %d\n", (void *)numPtr, *numPtr);
free(numPtr); // 释放动态分配的内存
return 0;
}
在这个例子中,modifyPointer
函数接收一个指向指针的指针,并在函数内部分配了新的内存地址,并将其值设为 30。然后,将指针本身修改为指向这个新的内存地址。在 main
函数中,我们声明了一个指针 numPtr
,并将其初始化为 NULL
。通过传递 &numPtr
(即指向 numPtr
的指针)来调用 modifyPointer
函数。在函数内部,通过解引用 **ptr
,我们可以修改指针 numPtr
本身,进而使其指向新分配的内存地址。
这两个例子展示了如何通过传递一级指针和二级指针来实现不同的功能。
用基本变量int 举例说明一级指针、二级指针普通方式的修改和解引用
首先是普通的修改和解引用方式:
#include <stdio.h>
int main() {
int num = 10; // 定义一个整数变量 num,初始化为 10
// 修改 num 的值为 20
num = 20;
// 解引用 num 并打印其值
printf("Value of num: %d\n", num);
return 0;
}
这个例子中,我们直接使用变量 num
来修改和解引用。没有涉及指针的使用。
接下来,我们使用一级指针来修改和解引用:
#include <stdio.h>
// 通过一级指针修改和解引用
void modifyValue(int *ptr) {
*ptr = 20; // 修改指针所指向的数据
}
int main() {
int num = 10; // 定义一个整数变量 num,初始化为 10
// 通过一级指针修改 num 的值为 20
modifyValue(&num);
// 通过一级指针解引用并打印其值
printf("Value of num: %d\n", num);
return 0;
}
在这个例子中,我们定义了一个函数 modifyValue
,它接收一个指向整数的指针,并通过解引用来修改指针所指向的数据。
最后,我们使用二级指针来修改和解引用:
#include <stdio.h>
#include <stdlib.h>
// 通过二级指针修改和解引用
void modifyValue(int **ptr) {
**ptr = 20; // 修改指针所指向的数据
}
int main() {
int num = 10; // 定义一个整数变量 num,初始化为 10
int *ptr = # // 定义一个指向整数的指针,指向 num
// 通过二级指针修改 num 的值为 20
modifyValue(&ptr);
// 通过二级指针解引用并打印其值
printf("Value of num: %d\n", num);
return 0;
}
在这个例子中,我们定义了一个函数 modifyValue
,它接收一个指向指针的指针,并通过二级指针的解引用来修改指针所指向的数据。
这些例子展示了普通方式、一级指针和二级指针分别如何修改和解引用整数变量。