C语言中的指向指针的指针是如何工作的?(以及何时可能会使用它们?)
在Git 2.0的一个代码示例中,展示了指向指针的使用方式。Linus在其中提到了指针到指针的使用,并举了一个删除链表元素的例子。他指出,有些人在删除链表元素时使用了条件判断,但这样做并不高效。相反,他们可以使用指向指针的指针,并将其初始化为list_head的地址。在遍历链表时,他们可以通过执行`*pp = entry->next`来删除元素,而无需使用任何条件判断。这样可以简化代码,并减少函数中的行数。
然后,一位用户在评论中提到了一个有关Linus Torvalds的视频,名为“Linus Torvalds's Double Pointer Problem”。另一位用户在评论中提到了一个有关指针理解的博客文章,其中解释了为什么将前一个元素作为指向指针的指针比作为指针更好。博客文章中提出了一个链表的例子,并展示了如何使用指向指针的指针来删除元素。
总结起来,指向指针的工作方式如下:通过使用指向指针的指针,可以在遍历链表时删除元素而无需使用条件判断。通过将前一个元素定义为指向指针的指针,可以简化代码并消除特殊情况的处理。
这种技术的使用场景是在需要删除链表元素时,特别是当链表中的元素值等于指定值时。通过使用指向指针的指针,可以更简洁地实现这个功能。
这些信息可以帮助读者理解指向指针的工作原理以及在何种情况下可以使用它们。同时,提供的代码示例和参考资料可以帮助读者更深入地理解这个概念。
指针指向指针在C语言中是如何工作的?什么时候会使用它们?
首先,指针是一个变量,就像任何其他变量一样,但它保存了一个变量的地址。
指向指针的指针也是一个变量,就像任何其他变量一样,但它保存的是一个变量的地址。这个变量碰巧是一个指针。
当你需要返回堆上某个内存的指针,但不使用返回值时,可以使用它们。
例如:
int getValueOf5(int *p) { *p = 5; return 1;//成功 } int get1024HeapMemory(int **p) { *p = malloc(1024); if(*p == 0) return -1;//错误 else return 0;//成功 }
然后这样调用它:
int x; getValueOf5(&x);//我想填充int变量,所以传递它的地址 //此时x为5 int *p; get1024HeapMemory(&p);//我想填充int*变量,所以传递它的地址 //此时p保存了在堆上分配了1024字节内存的地址
还有其他用途,例如每个C程序的main()参数都有一个指向指针的指针,用于argv,其中每个元素保存的是命令行选项的字符数组。但是当你使用指针指向指针指向二维数组时,必须小心,最好使用指向二维数组的指针。
为什么它是危险的?
void test() { double **a; int i1 = sizeof(a[0]);//i1 == 4 == sizeof(double*) double matrix[ROWS][COLUMNS]; int i2 = sizeof(matrix[0]);//i2 == 240 == COLUMNS * sizeof(double) }
这是一个正确使用指向二维数组的指针的示例:
int (*myPointerTo2DimArray)[ROWS][COLUMNS]
但是,如果要支持可变数量的行和列,就不能使用指向二维数组的指针。但是当你事先知道行和列的数量时,可以使用二维数组。
指针是C语言中的一个重要概念,可以用于存储和处理内存地址。指针是一个变量,其值为内存地址,可以用来访问该地址上存储的数据。指针可以指向不同类型的数据,包括其他指针。
在C语言中,指针到指针是指一个指针变量存储另一个指针变量的地址。指针到指针的使用有以下几个原因:
- 数组的名称通常表示其第一个元素的地址。因此,如果数组包含类型为t的元素,则对数组的引用具有类型t *。如果考虑到类型为t的数组的数组,则对该二维数组的引用将具有类型(t *)* = t **,因此是指针到指针。
- 尽管字符串数组听起来是一维的,但实际上它是二维的,因为字符串是字符数组。因此,使用char **来表示字符串数组的指针。
- 如果函数f要修改参数为t *类型的变量,则函数f需要接受t **类型的参数。
- 许多其他原因,无法在此列举。
以下是一个示例代码,演示了指针到指针的使用:
#includevoid changeValue(int** ptr) { int value = 10; *ptr = &value; } int main() { int num = 5; int* ptr1 = # int** ptr2 = &ptr1; printf("Value of num: %d\n", num); printf("Value of *ptr1: %d\n", *ptr1); printf("Value of **ptr2: %d\n", **ptr2); changeValue(ptr2); printf("New value of num: %d\n", num); return 0; }
在上面的代码中,首先创建了一个整数变量num,并且创建了一个指向num的指针ptr1,然后创建了一个指向ptr1的指针ptr2。通过使用*和**运算符,可以访问num的值。在changeValue函数中,将ptr指向了一个新的变量value,并通过修改ptr2来改变num的值。
指针到指针在C语言中的使用非常灵活,可以用于处理复杂的数据结构和实现动态内存分配。当需要在函数中修改指针变量的值时,可以使用指针到指针。