结构体指针的指针使用
在C/C++中,自定义类,结构体等默认都是按值传递的,按值传递在函数中是无法改变参数的值的。
当函数要改变参数的值时,可以用指针传递参数,改变指针所指地址的值。
但是当我们要改变指针所指的地址时要怎么办呢?
这就要用到指针的指针了。例子:
#include <iostream>
using namespace std;
typedef struct node {
int data;
}node;
void change( node **p ) {
*p = new node();
(*p)->data = 1;
}
int main()
{
node *p;
change( &p );
cout << p->data << endl;
return 0;
}
using namespace std;
typedef struct node {
int data;
}node;
void change( node **p ) {
*p = new node();
(*p)->data = 1;
}
int main()
{
node *p;
change( &p );
cout << p->data << endl;
return 0;
}
在函数中,要给 p 分配内存空间,所以要改变结构体指针 p 的值,如果用 change( node *p ),默认 p 是按引用传递,p 的地址不会改变。
用 change( node **p ) 传递指针的指针,在给参数时用取地址符号 &p 把储存指针的地址传递给函数。在函数中用复引用符号 *p 把储存指针的地址转化为指针。然后就可以改变指针所指的内存地址了。
还有一个要注意的问题是优先级问题。
-> 的优先级高于 * ,如果用没有加括号 *p->data = 1,相当于 *( p->data ) = 1。会编译出错。
所以必须加括号!