二维指针与函数参数
原文:http://www.b2cbeta.com/program-life/%E4%BA%8C%E7%BB%B4%E6%8C%87%E9%92%88%E4%B8%8E%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0
很久没有写c/c++代码了,不过以前积累的一些点还是慢慢积累下来。备用嘛
一般函数中,指针作为参数不会有太多的问题,通常传指针时会传入指针指向可用地址的最大长度。函数内操作时用到拷贝函数时,需要限定这个最大值(字符串指针通常会这么做)。不然会越界。指针作为函数参数传递时,编译器为指针参数制造了一个副本,在函数体内对这个指针副本指向的进行修改,对应的指针参数的内容也做了一个修改,这就是为什么可以用指针作为输出参数的原因。
举一个例子:
int test_point(char *a, int len) { char b[10] = “iamb”; memcpy(a, b, len); } int main() { char *a = “iama”; test_point(a, 10); }
在调用test_point函数时,编译器创建了指针_a,指向a所对应的内容“iama”,这个时候通过memcpy可以使_a指向的内容变成”iamb”。因为a和_a指向的内容一致,所以a的内容也变成了”iamb”。
如果我们想在函数内申请一块动态内存,外面可以访问,应该怎么做呢?
以下代码行不行呢?
int test_point(char *a, int len) { a = (char *)malloc(sizeof(char) * len); //动态申请域名,想供外部使用。 //do some stuff } void test() { char *a = NULL; test_point(a, 20);//想申请20个字符大的内存。 strcpy(a, “hello,world”);//?? }
运行到strcpy就会出现错误,从上面的分析可以看出,test_point内部的a只是副本_a,如果把动态分配的内存赋值给了_a,也是就是改变了_a的指向,原先指向于a相同的内容地址现在指向了动态分配的内存。这个时候,a和_a完全没有联系了。
所以strcpy(a, “hello,world”);这句话执行时,a还是指向NULL,导致出错!
那么如何来解决这个问题呢?推出我们的主角,二维指针。
int test_point(char **a, int len) { *a = (char *)malloc(sizeof(char) * len); //动态申请域名,想供外部使用。 //do some stuff } void test() { char *a = NULL; test_point(&a, 20);//注意要使用& strcpy(a, “hello,world”); }
这样就搞定问题了。这是为什么呢?
仔细想想其实很简单,看下面的顺序
a->*a->**a
_a->*a->malloc
a->*a->malloc
来看看你。哈啊和。对指针很迷茫~~
呵呵,迷茫就对了…我到现在也很迷茫,哈哈~