免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4341 | 回复: 6
打印 上一主题 下一主题

[C] C语言强制转换问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-05 23:53 |只看该作者 |倒序浏览
代码如下:

  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是指针了,还是地址变为指针类型了,还是。。。。。。?

接受不了啊。天哪

论坛徽章:
0
2 [报告]
发表于 2014-05-06 00:13 |只看该作者
我在网上又找来一个例子:

问题:

C++新手 想问一下
static unsigned char* pDepthTexBuf;
depthTexID = initTexture((void**)&pDepthTexBuf,texWidth, texHeight) ;
里面(void**)&表示什么意思?


回答:

void*是无类型指针。
void**就是无类型指针的指针。
&取变量地址的运算符。
(类型)为强制转换类型。
(void**)&变量,就是把变量的地址强制转换为无类型指针的指针


我们来看最后一句话, “(void**)&变量,就是把变量的地址强制转换为无类型指针的指针”

变量的地址强制转换为指针的指针?     大哥呀, 地址就一个存储区域啊, 指针是变量啊,你说指针指向这个地址这个很正常, 你说把地址变成指针的指针, 难道包子还能变成烧饼不成啊。

于是我想了一根烟功夫,只有一种情况下我能相通这个问题,但是似乎C语言书中从未提及:

先说一个简单的:

int i = 10;  char *p;
   p = (char *) &i ;

i是变量,于是i分配了一个地址存放这个变量名,然后再分配一个存储10的空间, 于是i指向了存储10的空间(这不变成指针了?不知道实际分配变量是否是这样,)
于是取出i的地址, 强制转换为char *, 这么做的意义为让i的地址能接受p的指向(并不是说把地址转换为指针),因为p为char *,所以要强制转换一下。

再来看看:

(OCIEnv **) &envhp

取出envhp地址,强制转换后,让envhp这个地址能接受指针的指针的指向。

OCIEnv **p;

p = &envhp;  p = (OCIEnv **) &envhp 是一个道理, 还要强制鸟啊。

论坛徽章:
0
3 [报告]
发表于 2014-05-06 07:25 |只看该作者
为了在函数调用后返回
如  FILE  *fp = fopen("aaa.txt", "r");
在这里是可以得到一个新的文件指针,而如果将 fp 放到一个函数中,则需要使用
func_open((FILE **)&fp )
这样才可以保证你得到打开的文件指针。

论坛徽章:
0
4 [报告]
发表于 2014-05-06 09:51 |只看该作者
回复 3# ljmmail

fopen的函数原型本来就是穿char * , 这个很正常啊。 我的意思是,本身要求穿char **的, 你故意传个 (char **) &, 这有意思吗?

   

论坛徽章:
0
5 [报告]
发表于 2014-05-06 10:51 |只看该作者
朋友,帮个忙啊

论坛徽章:
0
6 [报告]
发表于 2014-05-06 12:40 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2014-05-06 16:03 |只看该作者
main()
{
     FILE  *fp = NULL;
    func_file((void **)&fp);     // 这是正确的书写格式
  
}

//  在函数中 fp 地址是不可以修改的, 我们仅仅可以修改 fp 指向内存 *fp 中的内容
func_file(void  **fp)
{
      FILE  *fr;
      fr = fopen("aaaa.txt", "r");
      *fp  = fr    // 这里必须写成 *fp, 才可以保证函数中文件指针返回
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP