【求助帖】void指针函数可以return指针吗

hongyedaxia23 2014-06-05 11:47:50
各位大侠好:

小弟最近在阅读公司设备的里面的程序,公司设备程序是用Labwindows/CVI开发的,其中有一段代码,小弟有点疑惑,还请各位大侠帮忙点拨。谢谢!

1)void指针空函数可以return指针?
2)形参pnNum为int型指针,在语句 *pnNum = atoi(psToken)中*pnNum是否指的是取指针内容的意思?
3)为什么要以&sys.nRShunt,int *pnNum指针和地址的方式传递值?是否可以直接sys.nRShunt的int型直接传递?

=================================================================
主程序中的语句:
sys.pfRShunt = string_to_array(sData, FLOAT, &sys.nRShunt);
(sys.pfRshunt是在头文件中声明的为float浮点指针,sData是字符数组,sys.nRShunt是头文件中声明的int值)

string_to_array函数定义如下:
void *string_to_array(char *sStr, int type, int *pnNum)
{
int i;
char *psToken;
int *iArray;
long *lArray;
float *fArray;
double *dArray;

psToken = strtok(sStr, ",");
if ( psToken ) *pnNum = atoi(psToken);
if ( *pnNum > 0 )
{
if ( type == INT ) iArray = calloc(*pnNum, sizeof(int));
if ( type == LONG ) lArray = calloc(*pnNum, sizeof(long));
if ( type == FLOAT ) fArray = calloc(*pnNum, sizeof(float));
if ( type == DOUBLE ) dArray = calloc(*pnNum, sizeof(double));
i = 0;
while ( (psToken = strtok(NULL, ",")) != NULL )
{
if ( type == INT ) iArray[i++] = atoi(psToken);
if ( type == LONG ) lArray[i++] = atol(psToken);
if ( type == FLOAT ) fArray[i++] = atof(psToken);
if ( type == DOUBLE ) dArray[i++] = atof(psToken);
}
if ( type == INT ) return iArray;
if ( type == LONG ) return lArray;
if ( type == FLOAT ) return fArray;
if ( type == DOUBLE ) return dArray;
}

return NULL;
}
...全文
202 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cfvmario 2014-06-05
  • 打赏
  • 举报
回复
函数返回值的类型是void*,不是void…… 任何类型指针可以赋给void*类型的指针。 因为函数对pnNum的值进行了修改,所以参数要用指针类型,不然因为C是传值,就无法修改。不过个人不推荐这种编程风格,良好的编程风格应该是,函数不应该修改参数的值。尽量用对象来避免这一点。万不得已一定要修改,请用&引用参数,语义是清楚的。
版主大哥 2014-06-05
  • 打赏
  • 举报
回复
传参这块看你好像不懂,建议去百度,好好了解一下
版主大哥 2014-06-05
  • 打赏
  • 举报
回复
1)void指针空函数可以return指针? 可以 2)形参pnNum为int型指针,在语句 *pnNum = atoi(psToken)中*pnNum是否指的是取指针内容的意思? 不是取,是赋值 3)为什么要以&sys.nRShunt,int *pnNum指针和地址的方式传递值?是否可以直接sys.nRShunt的int型直接传递? 因为传进去还要修改参数,所以使用引用或指针。 可以,但是进入函数修改sys.nRShunt,只是修改了一个临时变量,而传时的参数是没有改变
hongyedaxia23 2014-06-05
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
*pnNum = atoi(psToken); 等价于 pnNum[0] = atoi(psToken);//这个应该好懂些吧。
哈哈多谢。理解了。
赵4老师 2014-06-05
  • 打赏
  • 举报
回复
*pnNum = atoi(psToken); 等价于 pnNum[0] = atoi(psToken);//这个应该好懂些吧。
hongyedaxia23 2014-06-05
  • 打赏
  • 举报
回复
引用 1 楼 xihu1364 的回复:
1)void指针空函数可以return指针? 可以 2)形参pnNum为int型指针,在语句 *pnNum = atoi(psToken)中*pnNum是否指的是取指针内容的意思? 不是取,是赋值 3)为什么要以&sys.nRShunt,int *pnNum指针和地址的方式传递值?是否可以直接sys.nRShunt的int型直接传递? 因为传进去还要修改参数,所以使用引用或指针。 可以,但是进入函数修改sys.nRShunt,只是修改了一个临时变量,而传时的参数是没有改变
感谢回复。 *pnNum = atoi(psToken)是一句赋值的表达句。疑惑就是pnNum在函数形参中已定义为int型指针,在表达式中作为指针变量前面加了一个“ * ”应该是取地址中内容的意思了吧? sys.nRShunt是int型,在头文件中定义为全局变量,如果在函数内修改的话,应该可行的吧?
hongyedaxia23 2014-06-05
  • 打赏
  • 举报
回复
引用 3 楼 cfvmario 的回复:
函数返回值的类型是void*,不是void…… 任何类型指针可以赋给void*类型的指针。 因为函数对pnNum的值进行了修改,所以参数要用指针类型,不然因为C是传值,就无法修改。不过个人不推荐这种编程风格,良好的编程风格应该是,函数不应该修改参数的值。尽量用对象来避免这一点。万不得已一定要修改,请用&引用参数,语义是清楚的。
感谢回复,sys.nRShunt是int型值,在预处理文件定义的这个全局变量,如果在函数内修改的话,应该也可行的吧?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧