C/C++中使用指针可以减少函数传递的参数
例如:
typedef struct
{
int r[MAX];
int length;
}SqList;
调用void test(SqList s)
函数时,会把结构体SqList
拷贝一份传入函数,这样就使得效率变低。
使用指针可以传递结构体,或者数组
二维指针主要用在在子函数中有新生成的变量需要回传回主函数。
void main()
{
SqList S;
S.length = 10;
SqList* l = &S;
void test3(SqList* s);
std::cout << l << " " << l->length << std::endl;
test3(l);
std::cout << l << " " << l->length << std::endl;
SqList** ll = &l;
std::cout << ll << " " << *ll << " " << " " << (*ll)->length << std::endl;
void test(SqList** s);
test(ll);
std::cout << ll << " " << *ll << " " << " " << (*ll)->length << std::endl;
}
void test(SqList** s)
{
*s = (SqList*)malloc(sizeof(SqList));
(*s)->length = 1;
std::cout << s << " " << *s << " " << " " << (*s)->length << std::endl;
}
void test3(SqList* s)
{
s = (SqList*)malloc(sizeof(SqList));
s->length = 1;
std::cout << s << " " << s->length << std::endl;
}
结果如下
0037EA24 10
0043AE80 1
0037EA24 10
0037EA18 0037EA24 10
0037EA18 0043BEC0 1
0037EA18 0043BEC0 1
使用一级指针时,使用malloc
函数重新生成的结构体变量将无法传回主函数,而是用二级指针则可以实现回传。
需要注意:二级指针仅仅是把新分配的内存地址返回去,在堆上空间的分配和回收是由程序员自己完成,所以可以正确返回新分配的内存地址的值,而那些在栈上分配空间的变量,则不能用二级指针传值,因为局部变量出了作用域就会被编译器释放,例如用在int型时,由于int型局部变量是在栈上分配存储空间的,所以回传回去实际值已经被释放,返回的值就是错误的。如下:
void main()
{
int a = 10;
int* p=&a;
int** ptr;
ptr = &p;
std::cout << ptr << " " << *ptr << " " << **ptr << std::endl;
void test2(int** a);
test2(ptr);
std::cout << ptr << " " << *ptr << " " << **ptr << std::endl;
}
void test2(int** a)
{
int b = 5;
*a = &b;
std::cout << a << " " << *a << " " << **a << std::endl;
}
输出结果:
003DEBA8 003DEBB4 10
003DEBA8 003DEAB0 5
003DEBA8 003DEAB0 13083592