更新时间:2023-09-03 17:21:41
你们好,最近小艾特发现有诸多的小伙伴们对于c语言void是啥,c语言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是无类型,那么每次算术运算我们就不知道该操作几个字节,例如char型操作sizeof(char)字节,
29、 而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);
以上就是c语言void是什么意思这篇文章的一些介绍,希望对大家有所帮助。