在C/C+;中使用双指针有什么好处+; 我对C/C++是新的。< /P>
我正在研究一些与树相关的编码问题,遇到了这个双指针表示法。在下面的函数中,我们可以使用单指针作为第一个参数,就像使用双指针一样在C/C+;中使用双指针有什么好处+; 我对C/C++是新的。< /P>,c++,c,pointers,C++,C,Pointers,我正在研究一些与树相关的编码问题,遇到了这个双指针表示法。在下面的函数中,我们可以使用单指针作为第一个参数,就像使用双指针一样 void operate(struct Node *root, struct Node **head_ref){ //do something} 有两种解释指针的方法;对某物或数组的引用。考虑到这是一个树,这可能是第一个:对另一个指针的引用 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,free。而不是在堆栈上分配
例如,打包长度未知的字符串的函数
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);
}
#包括
作废新材料(作废**p,尺寸){
*p=malloc(s);
/*做点什么*/
}
int main(){
int*p;
新马洛克(无效**)和p,规模(内部)*10;
}
Read Say itpointer to pointer
不是double pointer
,double是一种数据类型,它的好处是为2d/3d数组分配内存是的,二维数组也可以表示为指针。