目录
1.malloc函数
C的动态分配内存函数,该函数接受一个参数:所需的内存字节数。malloc()函数会找到合适的空闲内存块,这样的内存是匿名的。也就是说,malloc()分配内存,但是不会为其赋名。然而,它确实返回动态分配内存块的首字节地址。因此,可以把该地址赋给一个指针变量,并使用指针访问这块内存。然而,从ANSI C标准开始,C使用一个新的类型:指向void的指针。该类型相当于一个“通用指针”。malloc()函数可用于返回指向数组的指针、指向结构的指针等,所以通常该函数的返回值会被强制转换为匹配的类型。在ANSI C中,应该坚持使用强制类型转换,提高代码的可读性。然而,把指向void的指针赋给任意类型的指针完全不用考虑类型匹配的问题。如果malloc()分配内存失败,将返回空指针。
double * ptd;
ptd = (double *)malloc(30*sizeof(double));
以上代码为30个double类型的值请求内存空间,并设置ptd指向该位置。注意,指针ptd被声明为指向一个double类型,而不是指向内含30个double类型值的块。回忆一下,数组名是该数组首元素的地址。因此,如果让ptd指向这个块的首元素,便可像使用数组名一样使用它。也就是说,可以使用表达式ptd[0]访问该块的首元素,ptd[1]访问第2个元素,以此类推。malloc分配的内存,可用free函数回收,如free(ptd);
2.new函数
C++中使用new函数来分配内存。
int *pn = new int;
new int 告诉程序,需要适合存储int的内存。new运算符根据类型来确定需要多少内存。然后,它找到这样的内存,并返回其地址。接下来,将地址赋给pn,pn是被声明为指向int的指针。现在,pn是地址,*pn是存储在那里的值。通过delete来回收内存。
delete pn;
释放pn指向的内存。
使用new 来创建动态数组
int *p = new int [10];
//使用delete释放
delete [] p;
3.结构指针
struct guy {
struct names handle;
char favfood[LEN];
char job[LEN];
float income;
};
声明结构指针很简单:
struct guy * him;
首先是关键字struct,其次是结构标记guy,然后是一个星号(*),其后跟着指针名。这个语法和其他指针声明一样。
该声明并未创建一个新的结构,但是指针him现在可以指向任意现有的guy类型的结构。例如,如果barney是一个guy类型的结构变量,可以这样写:
him = &barney;
和数组不同的是,结构变量名并不是结构的地址,因此要在结构变量名前面加上&运算符。在本例中,fellow是一个结构数组,这意味着fellow[0]是一个结构。所以,要让him指向fellow[0],可以这样写:
him = &fellow[0];
him指向fellow[0],him + 1指向fellow[1]。
指针him指向结构变量fellow[0],如何通过him获得fellow[0]的成员的值?
第1种方法也是最常用的方法:使用->运算符。我们有下面的关系:
如果him == &barney,那么him->income 即是 barney.income
如果him == &fellow[0],那么him->income 即是 fellow[0].income
换句话说,指向结构的指针后面的->运算符和结构变量名后面的.运算符工作方式相同(不能写成him.incone,因为him不是结构名)。这里要着重理解him是一个指针,但是him->income是该指针所指向结构的一个成员。所以在该例中,him->income是一个float类型的变量。
第2种方法是,以这样的顺序指定结构成员的值:如果him == &fellow[0],那么*him == fellow[0],因为&和*是一对互逆运算符。因此,可以做以下替代:
fellow[0].income == (*him).income
必须要使用圆括号,因为.运算符比*运算符的优先级高。总之,如果him是指向guy类型结构barney的指针,下面的关系恒成立:
barney.income == (*him).income == him->income // 假设 him == &barney