你们好,最近小未来发现有诸多的小伙伴们对于void函数return的作用,void函数这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。
1、一个由C/C++编译的程序占用的内存分为以下几个部分:
2、3、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式类似于链表。
3、使用一般规律分析3个符号:([] 的优先级高于 *)
4、int *p[5]: p是一个数组,数组中的5个元素都是指针,指针指向int型,所以 *p[5] 是一个指针数组;
5、int (*p)[5]: p是一个指针,指向一个数组,数组有5个元素都是int类型,所以 (*p)[5]是一个数组指针;
6、int *(p[5]): 是一个指针数组,结合方式同第一个一样;
7、字面意思来理解指针数组与数组指针
8、(1)指针数组的实质是一个数组,这个数组中存储的内容全部是指针变量。
9、(2)数组指针的实质是一个指针,这个指针指向的是一个数组。
10、因此,为了避免混乱,我们在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值,一定要声明为void类型。这既是程序良好可读性的需要,也是编程规范性的要求。另外,加上void类型声明后,也可以发挥代码的“自注释”作用。代码的“自注释”即代码能自己注释自己。
11、如果函数无参数,那么应声明其参数为void
12、 在C++语言中声明一个这样的函数:
13、 int function(void)
14、 {
15、 return 1;
16、 }
17、 则进行下面的调用是不合法的:
18、 function(2);
19、 因为在C++中,函数参数为void的意思是这个函数不接受任何参数。
20、结构体指针
21、即指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。
22、如果把一个结构体变量的起始地址存放在一个指针变量中,那么,这个指针变量就指向该结构体变量。
23、在ANSI C标准中,不允许对void指针进行一些算术运算如p++或p+=1等,因为既然void是无类型,那么每次算术运算我们就不知道该操作几个字节,例如char型操作sizeof(char)字节,而int则要操作sizeof(int)字节。而在GNU中则允许,因为在缺省情况下,GNU 认为void *和char *一样,既然是确定的,当然可以进行一些算术操作,在这里sizeof(*p)==sizeof(char)
24、在C语言中,指针不单单可以指向一个变量,其他更有高级的用途,下面来总结一下指针的高级用法:
25、1.函数指针
26、函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。函数指针有两个用途:调用函数和做函数的参数。
27、函数指针数组
28、函数指针数组是由函数指针构成的数组,在编程的过程中,就类似普通数组是一连串类型相同的变量集合, 函数指针数组就是指向一连串返回值相同, 参数类型相同的函数集合
29、void*的实际应用
30、void*有一个特性,任何数据类型的指针可以无错误的转换为void*类型,但是void*类型无法转换为其它类型指针,而且仅限指针之间转换
31、void指针的使用一般多用于函数中,特别是函数指针大多都定义为void*;
32、类似于void * memcpy(_Out_writes_bytes_all_(_Size) void * _Dst, _In_reads_bytes_(_Size) const void * _Src, _In_ size_t _Size);
以上就是void函数这篇文章的一些介绍,希望对大家有所帮助。