- 论坛徽章:
- 0
|
代码如下:
static OCIEnv *envhp;
sword errcode = 0;
errcode = OCIEnvCreate((OCIEnv **) &envhp, (ub4) OCI_DEFAULT,
(dvoid *) 0, (dvoid * (*)(dvoid *,size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t)) 0,
(void (*)(dvoid *, dvoid *)) 0, (size_t) 0, (dvoid **) 0)
函数原型为:
sword OCIEnvCreate ( OCIEnv **envhpp,
ub4 mode,
const void *ctxp,
const void *(*malocfp)
(void *ctxp,
size_t size),
const void *(*ralocfp)
(void *ctxp,
void *memptr,
size_t newsize),
const void (*mfreefp)
(void *ctxp,
void *memptr))
size_t xtramemsz,
void **usrmempp );
我们只看第一个变量envhpp的使用,函数原型要求为指针的指针, 变量的声明为指针, 然后在函数中使用(OCIEnv **) &envhp
来强制转换。
有几个地方不太明白:
1. 既然函数要求为指针的指针, 使用者为什么不直接声明 static OCIEnv **envhp; 而是声明为 static OCIEnv *envhp,再转换呢, 这么做有什么意义?
2. 关于强制转换的问题
(OCIEnv **) &envhp, 我查看了网上关于这段话的理解: 取envhp的地址,然后强制转换为指针的指针类型,他们的解释是地址就是指针,指针就是地址,
我就奇怪了, &envhp明明是一个指针变量的地址,你强制转换一个地址,这是什么道理? 虽然说在C语言中,我们经常说指针就是指向地址, 但是指针至少是个变量,你转换变量我能理解,转换地址实在接受无能。
于是他们举了一个例子:
int i = 10; int *p;
p = (int *) &i ;
我仍然接受不了,在我的脑子里,我觉得i是个变量,分配了存储10的地址, 你取出i的地址,强制转换为 指针,请问i是指针了,还是地址变为指针类型了,还是。。。。。。?
接受不了啊。天哪 |
|