你们好,最近小未来发现有诸多的小伙伴们对于void函数可以return 0吗,void函数这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。
1、 C/C编译的程序所占用的内存分为以下几部分:
2、 1.堆栈区:编译器自动分配释放并存储函数的参数值和局部变量的值。它像数据结构中的堆栈一样工作。
3、 2.全局区域(静态区域)是静态的:全局变量和静态变量存储在一起,初始化的全局变量和静态变量在一个区域,未初始化的全局变量和未初始化的静态变量在另一个相邻区域。程序结束后由系统释放。
4、 3.堆:一般由程序员分配和释放。如果程序员不释放它,它可能会在程序结束时被OS回收。注意在数据结构上和堆不同,分配方式和链表类似。
5、 4.文本常量区域:这是放置常量字符串的地方。程序结束后由系统释放。
6、 5.程序代码区:存储函数体的二进制代码。
7、 使用一般规则分析三个符号:([]优先于*)
8、 Int *p[5]: p是一个数组,数组中的五个元素都是指针,指针指向Int类型,所以*p[5]是一个指针的数组;
9、 Int (*p)[5]: p是一个数组的指针,数组有五个Int类型的元素,所以(*p)[5]是一个数组指针;
10、 Int *(p[5]):是一个指针数组,组合方式和第一个一样;
11、 字面理解指针数组和数组指针
12、 (1)指针数组的本质是一个数组,这个数组存储的所有内容都是指针变量。
13、 (2)数组指针的本质是指针,指向一个数组。
14、 因此,为了避免混淆,我们在编写C/C程序时,必须逐个指定任何函数的类型。如果函数不返回值,则必须声明为void类型。这不仅是程序可读性好的需要,也是编程规范化的要求。此外,
15、 加入void类型声明后,代码还可以起到“自注释”的作用。代码的“自我注释”意味着代码可以自我注释。
16、 如果函数没有参数,应该声明它的参数是void。
17、 用C语言声明一个这样的函数:
18、 int function(void)
19、 {
20、 return 1;
21、 }
22、 拨打以下电话是非法的:
23、 function(2);
24、 因为在C中,函数参数是void,也就是说这个函数不接受任何参数。
25、 结构指示器
26、 也就是指向结构变量的指针,结构变量的起始地址就是指向这个结构变量的指针。
27、 如果结构变量的起始地址存储在指针变量中,那么指针变量指向结构变量。
28、 在ANSI C标准的曝光中,不允许对void指针进行一些算术运算,比如p或者p=1,因为由于void是非类型化的,所以我们不知道每次运算多少字节。
29、 例如,char类型操作sizeof(char)字节,而int操作sizeof(int)字节。在GNU中是允许的,因为默认情况下GNU认为void *和char *是一样的。既然是肯定的,
30、 当然也可以进行一些算术运算,其中sizeof(*p)==sizeof(char)。
31、 在C语言中,指针不仅可以指向一个变量,而且还有高级用法。让我们总结一下指针的高级用法:
32、 1.函数指针
33、 函数指针是指向函数的指针变量。所以“函数指针”本身首先应该是一个指针变量,但指针变量指向的是一个函数。这就好比用指针变量指向整型变量,字符型和数组,这里就是指向函数。
34、 函数攀数指针有两个用途:调用函数和做函数的参数。
35、 函数指针数组
36、 函数指针数组是由函数指针组成的数组。在编程过程中,就像普通数组是一系列类型相同的变量集一样,函数指针数组是指一系列返回值相同、参数类型相同的函数集。
37、 void的实际应用*
38、 Void*有一个特性,任何数据类型的指针都可以无错的转换成void*类型,但是void*类型不能转换成其他类型的指针,只能在指针之间转换。
39、 Void指针一般用在函数中,尤其是函数指针大多定义为void *;
40、 类似于void * memcpy(_ Out _ writes _ bytes _ all _(_ Size)void * _ Dst,_ In _ reads _ bytes _(_ Size)const void * _ Src,_ In _ Size _ t _ Size);
以上就是void函数这篇文章的一些介绍,希望对大家有所帮助。