在论坛给朋友解释概念的时候写的,记录下来, 省的以后再动口水^_^.
还有函数指针比如void (*pf)(void);,既然是指针那么内容也是一个地址,只是这个地址比较特殊。是一个函数的地址。
当我们定义一个函数时候,比如void f(void);这个函数的名字就代表函数的地址了,它也是一个函数指针,内容是函数的地址,既然是一个指针,那么它指向的那个函数应该就是(*f)()表示了。但为什么用f()来表示呢。我估计是为了方便(要不然还不烦死)。而函数指针跟这个f一样也是指向函数的,内容是函数的首地址,所以pf=f;可以赋值。(*pf)();表示调用这个函数(*pf表示指向的内容嘛,那就是那个函数)。当然我们看到光用f();就可以调用这个函数(虽然f也是一个指针,内容也是函数首地址),所以(*pf)();也可以写成pf();(在哪本书上看到过,忘了,对不住哈)
^_^.数组指针也跟函数指针差不多。娃哈哈。
#include<stdio.h>
void f(void)
{
}
int main()
{
printf("%p",f);//我连函数都没调用,表明只要定义一个函数了这个函数就有一个地址,如果调用这个函数,就会去那个地址干点什么。
return 0;
}
还有类型转换:
类型不一样,如果要相互赋值或者运算的时候,就要转换了。
比如(void *)指针什么都能指,而(int *)只能指向int类型。
当调用malloc函数时候,malloc返回的void *.
int *pINT=(int *)malloc(sizeof(int)*100);
.......
free(pINT);
pINT=NULL;//这两句是后话,表明我已经习惯看到malloc就记得写free^_^
有些不需要强制转换,系统帮你搞定,如int,赋值给float.
但是float赋值给int就要强制转换。
有一个简单记忆方法:
"大范围的"(添加一个双引号表明我指的是感觉上大的,float比int大,void*可以指向任意类型,所以比int *大,)就要强制类型转换。
其实最好不同类型赋值时候都强制类型转换。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=555728