中易网

C语言void指针到底是什么?什么时候使用void指针?

答案:2  悬赏:0  
解决时间 2021-04-07 01:06
C语言void指针到底是什么?什么时候使用void指针?
最佳答案
(1)用空指针终止对递归数据结构的间接引用。
递归是指一个事物由这个事物本身来定义。请看下例:

unsigned factorial(unsinged i)
{
if(i=0 || i==1)
{
return 1;
}
else
{
return i * factorial(i-1);
}
}
在上例中,阶乘函数factoriai()调用了它本身,因此,它是递归的。
一个递归数据结构同样由它本身来定义。最简单和最常见的递归数据结构是(单向)链表,链表中的每一个元素都包含一个值和一个指向链表中下一个元素的指针。请看下例:
struct string_list
{
char *str;
struct string_list *next;
};
此外还有双向链表(每个元素还包含一个指向链表中前一个元素的指针)、键树和哈希表等许多整洁的数据结构,一本较好的介绍数据结构的书中都会介绍这些内容。
你可以通过指向链表中第一个元素的指针开始引用一个链表,并通过每一个元素中指向下一个元素的指针不断地引用下一个元素;在链表的最后一个元素中,指向下一个元素的指针被赋值为NULL,当你遇到该空指针时,就可以终止对链表的引用了。请看下例:
while(p!=NULL)
{

p=p->next;
}
请注意,即使p一开始就是一个空指针,上例仍然能正常工作。
(2)用空指针作函数调用失败时的返回值。
许多C库函数的返回值是一个指针,在函数调用成功时,函数返回一个指向某一对象的指针;反之,则返回一个空指针。请看下例:
if(setlocale(cat,loc_p)==NULL)
{


}
返回值为一指针的函数在调用成功时几乎总是返回一个有效指针(其值不等于零),在调用失败时则总是返回一个空指针(其值等于零);而返回值为一整型值的函数在调用成功时几乎总是返回一个零值,在调用失败时则总是返回一个非零值。请看下例:
if(raise(sig)!=0){


}
对上述两类函数来说,调用成功或失败时的返回值含义都是不同的。另外一些函数在调用成功时可能会返回一个正值,在调用失败时可能会返回一个零值或负值。因此,当你使用一个函数之前,应该先看一下它的返回值是哪种类型,这样你才能判断函数返回值的含义。
(3)用空指针作警戒值
警戒值是标志事物结尾的一个特定值。例如,main()函数的预定义参数argv是一个指针数组,它的最后一个元素(argv[argc])永远是一个空指针,因此,你可以用下述方法快速地引用argv中的每一个元素:

# include
# include
int
main ( int argc, char * * argv)
{
int i;
printf ("program name = \"%s\"\n", argv[0]);
for (i=l; argv[i] !=NULL; ++i)
printf ("argv[%d] = \"%s\"\n", i, argv[f]);
assert (i = = argc) ; / * see FAQ XI. 5 * /
return 0; / * see FAQ XVI. 4 * /
}
全部回答
任何时候都可以使用数组,使用指针。 定义时,通常只有字符指针,和字符数组指针直接定义。用来表示字符串或字符串数组。 其他一般定义数组。操作时用指针或数组。 其他指针,多半用在参数传递,数据结构内部(不确定需要内存的大小,或者链表,二叉树等链式结构)的时候。 还有一种是有些函数参数就是指针,这时定义一个指针,来操作传进来的指针参数比较好。 指针作为参数,有一下几种用法, 1)当作数组用,用来获取或设置数组元素。 2)把一个比较长的数据结构传入函数,只需要一个指针就够了。 3)传入变量的地址,用来读取或修改变量的值,主要是为了修改用。 直接定义一个不指向任何对象的指针,并且也从不给他赋值,没什么意义; 指针要么指向数组,要么指向变量,要么动态申请内存。 null指针,只是一个方便的指针,表示不指向任何对象。 真正有用的还是指向具体对象的指针。 如果定义了一个指针,使用时要让他指向一个具体对象,当需要他不指向什么对象的时候,给他赋值为null; ps: c语言,数组名只是一个指针常量而已,离开定义可见处,数组大小的信息就不存在了。 只有定义完全可见的地方,才可以获得数组的大小。 数组作为函数的参数,和外部引用声明都不能获得数组的大小。 参数只能传递指针,参数的大小只是指针的大小; 只能看到声明的地方,获取数组大小的努力,只能换来错误。 void fun1(int a[10]) //<==> void fun1(int a[]) <==>void fun1(int *a) { } void fun2(int [10][10])// <==>void fun2(int a[][10])<==> void fun2(int (*a)[10]) { }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
如何选家庭隔音材料?
建均汽车美容中心在什么地方啊,我要过去处理
说相反的话,激励一个人,的成语是什么
lol,瑞文怎么打安妮,白金的局
求英文自我介绍
合肥市和郑州比那个城市建设好
外国取材なんて、すごいね。 这里的 て 是表
安江离四川蓬安有多远
苹果大师这个地址在什么地方,我要处理点事
我想知道福尔摩斯当中“RACHE”是什么意思?
野生灵芝可以泡茶喝么
两个整数的和是86,小雪计算时将其中一个加数
(东方)[悠游亭]_レミフラすぴりっつ 键盘如何
离婚后再婚 但是户口本上还是未婚 去婚姻登记
淘宝达人请进!我收一假货,联系不上卖家,还
推荐资讯
为什么我的手机流量一会就没了
特来电汽车充电站(天津环渤海家居广场)在什么
莫来迟。繁红一夜经风雨,是空枝。意思 是 ?
中专毕业的护士执业证和大专毕业的有什么区别
考心理咨询师三级 培训可以是网校吗
子贡问曰:“有一言而可以终身行之者乎?”子
如何高效的使用苹果产品的备忘录,提醒事项,
DNF Extractor_Suite_V1.31下载地址 准确的
要一些小清新,长点的文艺网名(不要非主流什
跟男友提结婚他说没钱
问:有谁知道LG32LD310-LA液晶电视电源板上
怎么找借口不去上班。在老家,想陪朋友玩,不
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?