函数与指针:
void fun(){
}
-----函数名---就是一个常指针-----函数的地址-----对函数名取地址在效果上与 函数名一样的----- fun == &fun
函数指针:
pfun=fun;//-------
pfun =&fun;
函数间接访问
pfun(XXX);
(*pfun)(XXX);//--------
int a;
int *p = &a;
XXXX (*FUN)(XXXX)
XXXX (*FUN1)(XXXX)
XXXX (*FUN2)(XXXX)
typedef int INT
//typedef void (*)(void) FUN;----error
int (*FUN)(void)//----------------是一个指针变量----存放的是函数指针----int (*) (void)
typedef int (*FUN)(void);//-------取别名。FUN成为了一种数据类型
int a[2];
FUN pfun[2];
void fun(){
FUN pfun[2];
pfun[0]=&fun1;
pfun[1]=&fun2;
(*pfun[0])();
(*pfun[1])();
}
--------------------------------------
空指针在函数指针中的应用:
typedef void (*FUN)(void)
void fun(){ }
void *p;
p = (void *)fun;
((FUN)p)();
或者
// (( void(*)(void) )p)();
------------------------------------------
void fun(){
}
void(*FUN)(void)
FUN = fun;//fun()
FUN();
fun(a,b,1)----add
fun(a,b,0)----dec
fun(){
if---1
a+b;
else
a-b
}
add(3,2)----int ---
add(3.0,2.0)-----float----
---------------------------------------
函数指针做函数参数的运用:
void fun(int a)
void fun(int *a)
void fun(void(*pfun)(void));
void fun(FUN pfun){
(*pfun)();
}
main(){
fun();
}
main(){
(*pfun)();
}
--------------------------------------
实践兴趣----------malloc(0)
#include
#include
int main(){
int *p =(int *)malloc(4);
if(p==NULL){
perror("malloc");
exit(-1);
}
*p=100;
printf("*p = %d\n",*p);
free(p);
return 0;
}
--------------------------------
函数能成功返回空间的几种方式:
1.
void get_mem(char **s){
*s=(char *)malloc(size);
}
2.
char *s;
void get_mem(){
s=(char *)malloc(size);
}
3.
char * get_mem(){
return (char *)malloc(size);
}
4.
char *get_mem(){
static char str[size];
return str;
}
///------------------
自学--自觉: void *calloc(size_t nmemb, size_t size);
//----------------------
volatile -----防编译器优化
优化选项----—O —O2
gcc -O2 -S -o *.S *.c
int main(){
volatile int a;
a=3;//----
a=4;//----
a=5;//----
return 0;
}
//------------------------
const int a=3;------//不可被直接修改,可以被间接修改
int const a;//同上,等价
const int *p ;//不能通该指针去修改所指向区间的内容,可以通过其他方式修改(其他指针,变量名等)
//指针本身的值可以被修改
int const *p ;
// 同上
int * const p;//指针所指向的空间的内容可以被修改
//指针本身的值不可被直接修改,可以通过其他方式修改
const int * const p;
//---------------------------
& | ~ ^ << >>
//---------------------------
char c 0x73
0111 0011----
& 1111 1101
0111 0011
0001--- 0x1
1111 0000 0010 ~
1111 1111 1101
c & ~(0x1<
0111 0011
| 0000 0100
c | (0x1<
-----------------------------
fun(int *a){
*a=4;
}
main(){
int a=3;
fun(&a)
}
----------------------------------------------
char *s ="nihao";
char s[]="nihao";
char *s[]={
"ni",
"hao",
"ma"
}
char s[][4]{
"ni",
"hao",
"ma"
}
---------------------------------
阅读(247) | 评论(0) | 转发(0) |