# include
void MyFun(int x);
void (*FunP)(int);
typedef void (*FunPtr)(int); //定义某一函数指针的类型
int main(int argc, char* argv[])
{
MyFun(10);
FunP = &MyFun;
(*FunP)(20); //调用方式1
FunP(30); //调用方式2
FunP = MyFun;
(*FunP)(40); //调用方式3
FunP(50); //调用方式4
FunPtr p1;
p1 = MyFun;
p1(60);
(*p1)(70);
p1 = &MyFun;
p1(80);
p1(90);
return 0;
}
void MyFun(int x)
{
printf("%d/n",x);
} sizeof
1.对于字符数组,sizeof与strlen的值是否相同?
字符串数组,最后一个都是结束符’/0’,sizeof()计算占据的总内存空间,而strlen只是计算除开’/0’的字符数(可以见标准库的strlen的实现)
2.Sizeof本质上是函数还是宏?
Sizeof是一个运算符。
3.Sizeof返回值是什么?
Sizeof返回值是size_t,定义为unsigned int
指针
1.int *p; &p,p,*p各有什么意思?
&p:该指针的地址;
P:该指针的内容:一个内存地址;
*p:p中内存地址对应相应的值;
2.你定义的指针初始化了没?
3.你理解指针的指针的概念吗?你会使用吗?
指针的指针:它的内容就是一个指针(地址),:如char **argv;如指针数组char *p[10]
4.你会定义函数指针?
void (*p)(int )
P是一个指针,它指向了一个函数,该函数没有返回值,参数是一个int变量;
typdef void (*p)(int);
p f1;
p f2;就可以类似地定义函数指针了。
5.你会使用函数指针调用函数吗?
函数名与函数指针都一样的,都是函数指针。函数名是一个const函数指针,而函数指针是一个函数指针变量。至于四种调用方法都可以,那是C语言的设计者规定的,主要是书写和阅读方便.
动态分配内存
1.动态分配的内存放在什么地方?
堆。
2.什么情况下要动态分配内存?
malloc使用的情况一般有两种:1.需要申请的内存太大了,一般栈的内存为1M,如果数组大于栈内存,就要malloc2.申请的内存大小不定,例如你要使用大小为n的内存,但是n是多少你并不知道,这时没法用char k[n];因为编译器不支持你用变量n来声明数组,此时要用malloc
2.动态申请的内存一定要释放,否则会内存泄露。你是否使用过内存检测工具?
《C专家编程中》的第七章亦对该问题有描述,简单摘要如下:
避免内存泄露:
每次当调用malloc分配内存的时候,注意在以后调用相应的free来释放它。
一种简单的方法就是在可能的时候使用alloca()来分配动态内存,以避免出现上述情况。当离开调用alloca的函数,它所分配的内存会被自动释放。(注:alloca函数是依赖于机器和编译器的,没有较好的可移植性,注意不要使用free释放alloca分配的空间.)
如何检测内存泄露
1.使用swap命令观察还有多少可用的交换空间
在一分钟内键入该命令三到四次,看看可用的交换区是否在减小。如果发现不断有内存被分配且从不被释放,一个可能的解释就是出现了内存泄露;
2.确定可疑的进程,看看它是不是该为内存泄露负责。
使用ps – lu用户名来显示所有进程的大小。同样数次重复这个命令,如果一个进程不断增长而从不缩小,那么它就有可能出现了内存泄露。