上一节说到函数复制传参的概念,还有一个主要的例证。
参见以下函数
int mallocMemory( int num, void *pointer)
{
pointer = malloc(num * sizeof(char));
return 0;
}
void * p =Null;
mallocMemory(5,p);
这个函数是一个动态分配内存的函数,但是实际上并没有实现功能。
因为C语言复制传值,实际上内存并没有分配给p,而是分配给p的一个副本,函数返回后副本即刻消失,因为这个副本是在栈中分配的。
所以p仍旧是Null指针,而且分配了无法释放的内存。
指针和数组是孪生兄弟,在C语言中他们本质上是一致的(数组也没有边界检查)。只是使用的方式不同罢了。
尤其是在函数参数中,函数的一个参数如果是数组,编译器也把它作为指针处理。
比如
int testPointer(char *p)
{
return 0;
}
和
int testPointer(char[] p)
{
return 0;
}
这两个函数编译后产生的机器码是一样的。
网上有很多关于如何让C语言有面向对象的特性的。其实归根到底还是用了C语言指针的特性。
C语言有结构体的概念,但是结构体中只能包含"成员变量",而没有"成员函数",但是却可以把指向函数的指针作为结构体的"成员变量",从而是它看上去像个类。如果没有指针,是没有办法模拟的。