* &a=25就是a=25
&a 的值是个指针常量
int *ip;//ip 为 int 型指针变量,这里主要是要注意格式(* 和 ip 靠在一起)和其意义(*ip 代表一个 int 型变量,而 ip 是一个 int 型指针变量,它存放着某个 int 元素的地址),没有所谓的 int* 类型,int *a,*b;//这样是可以成功定义出指针变量b的
ip++;//实际上是地址加了 sizeof(int)4位 。
关于指针和数组名:
int a[10];
int *p;
p=a;
sizeof(p),只会求得指针变量 p 所占字节数,而 sizeof(a) 则会求得数组总共所占字节数,这是数组名与指针变量的区别之一,另一个区别是数组名应该算是个指针常量即代表该数组首地址的值,它是不能改变的,比如就不能有a++了。
函数指针和指针函数:
int (f) (int x); //定义函数指针
int \fun(int x);//定义指针函数
int *p;
int n;
f = fun; //将 fun 函数的首地址值赋给指针变量 f ,也可以写成 f = &fun
p = fun(a);//将 fun 函数的返回值(也是个指针变量)赋给指针变量 p
而此时 f 也代表了 fun 函数,所以上一句也就可以写成:
p = f(n);//用 f 来表示 fun
函数指针声明时用 ( *f ) 作为函数名,表示进行 * 运算后获得实际函数,即 f 表示的是一个函数的地址(要明白函数名的意义其实是函数的地址,从这里可以一窥函数调用实现的本质),使用函数指针代替函数的要求是被指的具体函数的参数类型要和函数指针定义中对应的参数类型相同。
而指针函数,即返回值是一个指针变量,定义时函数名左右没有(),表示定义了一个进行函数调后获得的函数返回值将这个值进行 * 运算能够获得的对应的类型数据的指针变量(所以说,C 中定义函数时其实是在定义函数的返回值)
calloc()会用 0 初始化申请的内存,malloc()不会。
printf()和 scanf()中的 f 其实是表示 formatted 格式化,即格式化输入输出,
它们的不定参数输入输出是由一个宏实现的,具体可看标准函数库中他们的定义。