您的位置首页百科问答

C语言编程技巧void指针高级应用

C语言编程技巧void指针高级应用

的有关信息介绍如下:

C语言编程技巧void指针高级应用

void指针作为c语言程序编写中的高级部分,那么我们应该怎么使用void指针呢?现在我们一起来看看。

一个由C/C++编译的程序占用的内存分为以下几个部分:1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

3、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式类似于链表。4、文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。5、程序代码区:存放函数体的二进制代码。

使用一般规律分析3个符号:([] 的优先级高于 *)

int *p: p是一个数组,数组中的5个元素都是指针,指针指向int型,所以 *p 是一个指针数组;

int (*p): p是一个指针,指向一个数组,数组有5个元素都是int类型,所以 (*p)是一个数组指针;

int *(p): 是一个指针数组,结合方式同第一个一样;

字面意思来理解指针数组与数组指针

(1)指针数组的实质是一个数组,这个数组中存储的内容全部是指针变量。

(2)数组指针的实质是一个指针,这个指针指向的是一个数组。

因此,为了避免混乱,我们在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值,一定要声明为void类型。这既是程序良好可读性的需要,也是编程规范性的要求。另外,加上void类型声明后,也可以发挥代码的“自注释”作用。代码的“自注释”即代码能自己注释自己。

如果函数无参数,那么应声明其参数为void

  在C++语言中声明一个这样的函数:

  int function(void)

  {

  return 1;

  }

  则进行下面的调用是不合法的:

  function(2);

  因为在C++中,函数参数为void的意思是这个函数不接受任何参数。

结构体指针

即指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。

如果把一个结构体变量的起始地址存放在一个指针变量中,那么,这个指针变量就指向该结构体变量。

在ANSI C标准中,不允许对void指针进行一些算术运算如p++或p+=1等,因为既然void是无类型,那么每次算术运算我们就不知道该操作几个字节,例如char型操作sizeof(char)字节,而int则要操作sizeof(int)字节。而在GNU中则允许,因为在缺省情况下,GNU 认为void *和char *一样,既然是确定的,当然可以进行一些算术操作,在这里sizeof(*p)==sizeof(char)

在C语言中,指针不单单可以指向一个变量,其他更有高级的用途,下面来总结一下指针的高级用法:

1.函数指针

函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。函数指针有两个用途:调用函数和做函数的参数。

函数指针数组

函数指针数组是由函数指针构成的数组,在编程的过程中,就类似普通数组是一连串类型相同的变量集合, 函数指针数组就是指向一连串返回值相同, 参数类型相同的函数集合

void*的实际应用

void*有一个特性,任何数据类型的指针可以无错误的转换为void*类型,但是void*类型无法转换为其它类型指针,而且仅限指针之间转换

void指针的使用一般多用于函数中,特别是函数指针大多都定义为void*;

类似于void * memcpy(_Out_writes_bytes_all_(_Size) void * _Dst, _In_reads_bytes_(_Size) const void * _Src, _In_ size_t _Size);