先来作一个测试
struct Teacher{
char* name;
int age;
};
void getTeacher(Teacher* p) {
p->age = 60;
}
void main() {
Teacher t1;
t1.age = 1;
Teacher* t = &t1;
getTeacher(t);
printf("%d",t->age);
system("pause");
}
用上面的方案,将指针传入到一个方法,那个方法通过指针,是可以修改指针所指向的内容的!因此最后的输出为60,没有问题。
但我们在JNI开发中,常常会有一种情况,就是将没有赋值的一个指针,也就是空指针,传入了一个方法中。这是怎么回事?如下:
void getTeacher(Teacher **p) {
Teacher *tmp = (Teacher*)malloc(sizeof(Teacher));
tmp->age =320;
*p = tmp;
}
void main() {
Teacher *t = NULL;
getTeacher(&t);
printf("%d",t->age);
system("pause");
}
在传入方法前,指针为空,然后把指针取地址,相当于一个二级指针,传到了方法,方法内生成了一个指针,然后将原指针赋值,最后输出320。 这是一种空指针的赋值方案。
也可以用指针的引用,来代替二级指针
//指针的引用,代替二级指针
//Teacher* &p = (Teacher * *p)
void getTeacher(Teacher* &p) {
p = (Teacher*)malloc(sizeof(Teacher));
p->age = 200;
}
void main() {
Teacher *t = NULL;
getTeacher(t);
printf("%d",t->age);
system("pause");
}
如上的用法,就是直接传了一个一级指针进去!其实参数是一级指针的引用!这样就完成了给指针赋值!很多库的用法都是这样完成的。最后输出200.