我是 C/C++ 新手。
我正在研究一些与树相关的编码问题,并遇到了这种双指针表示法。我们可以在下面的函数中使用单指针作为第一个参数来做同样的事情吗,就像我们可以使用双指针一样。
void operate(struct Node *root, struct Node **head_ref){ //do something}
有两种解释指针的方法;对某物或数组的引用。考虑到这是一棵树,这可能是第一个:对另一个指针的引用。
C 中函数的每个参数都是按值传递的,这意味着如果您在函数内部更改指针,它不会在外部更改。为了保证它也被外部更改,您可以使用对指针的引用:双指针。您可以考虑以下示例。
void function(int a) {
a = 5;
}
即使在a
上面进行了更改,也不会在函数之外进行更改。但在另一种情况下,
void function(int * a) {
*a = 5;
}
该值a
也在函数之外更改。相同的思考过程可以应用于指针(它也是一个值)。
当你想要一个函数来处理 malloc 时,free 是主要原因。
如果要封装内存分配,这很有用。
例如一些 init(struct some_struct **)、free(struct some_struct **)。并让函数免费处理 malloc。而不是在堆栈上分配。
例如,一个打包未知长度字符串的函数。
size_t pack_struct(char** data, const struct some_struct * some_struct)
{
/**
* @brief buffer
* @note verify the needed buffer length
*/
char buffer [256]; // temporary buffer
*data = 0;
//const char* package_pattern = "%cW ;%u.%u;%s%c";
size_t len = sprintf(buffer, weight_package_pattern,
START_CHARACTER,
some_struct->ts.tv_sec,
some_struct->ts.tv_usec,
some_struct->string_of_unknown_length, // but no more then buffer
STOP_CHARACTER);
if(len == 0) {
perror("sprintf failed!\n");
return len;
}
// len++; // for end character if wanna some, see sprintf description
*data = (char*)malloc(len*sizeof(char)); // memory allocation !
strncpy(*data, buffer, len);
return len;
}
但是,在使用 C++ 编程时应避免使用此类技术。
分配内存时通常使用双指针。
#include <stdlib.h>
void new_malloc(void **p, size_t s) {
*p = malloc(s);
/* do something */
}
int main() {
int *p;
new_malloc((void **)&p, sizeof(int) * 10);
}