char* str3 = "hello";
char* str4 = "hello";
if (str3 == str4) {
printf("相等n");
}
else {
printf("不相等n");
}
//str1和str2的地址不相等
&数组名VS数组名
数组名表示数组首元素的地址。
函数指针:
函数也是在内存中的。
1.先在test.c中写一个程序,此时这个函数保存在test.c文件中。
2.进行编译。生成了一个exe程序。仍然是在磁盘上。(exe只剩下了二进制代码)
3.进行运行。双击这个exe,执行里面的内容,操作系统就会把这个文件内容,读取到内存中。
4.取这个内存的起始地址,也就得到了这个函数指针。
函数指针语法的差别比较大:
第一点区别:
typedef int(*Func)(int x,int y);
Func p=add;
int add(int x, int y)
int (*p)(int x,int y)
第二点区别:
普通指针支持很多的运算,但是函数指针只是支持*(*解不解应用作用不大)函数指针支持一个特殊的·操作,普通指针没有。函数调用操作。
void test() {
printf("hahahan");
}
//创建了一个变量 p,p是一个函数指针,指向test
//p的类型void(*p)()
void(*p)() = test;
p();
//也可以先解引用,再调用,但是和p()也没有啥区别。
(*p)();
typedef int(*Func)(int x,int y);
Func p=add;
int add(int x, int y) {
return x + y;
}
int main(){
int(*p)(int x, int y) = add;
int(*p2)(int, int) = add;
printf("%dn", p(10, 20));
printf("%dn", p2(10, 20));
(
*
(
void (*
)() )
0
) ();
把0号地址对应的内存,当成一个函数指针来执行。
void
(
*
signal
(
int
,
void
(
*
)(
int
) ) ) (
int
);
声明一个signal函数。
参数有两个,int,void(*)(int)
返回值是
void(*)(int)
函数指针有啥用呢?
1.通过函数指针数组,实现转移表的效果,来降低圈复杂度。
2.通过函数指针,实现回调函数的效果。
转移表的本质是函数指针数组。
通过数组去下标的方式,取代了if else的分支判断。
转移表使用的限制:
1.进行分支判定的变量,必须是整数值。(整数值才能和数组下表关联起来)
2.要求函数指针数组里面的这些函数,参数与返回值都是一样的。(这些一样了,才能放到同一个函数指针数组中)
基于函数指针才能实现回调函数。回调函数不是立即就调用,而是把这个函数交给别人,让别人在适合的时机进行调用。(库、框架、操作系统)
圈复杂度:一个函数里面,每次多一个分支(多一种可能性),就认为圈复杂度+1;
《code complete》
强烈推荐!!!!!
test.c写一些函数代码(储存在硬盘上)
编译器编译,把test.c=>exe(储存在硬盘上)
运行exe,操作系统就会把这个exe文件加载到内存中,并且执行内部的指令。(内存中已经是二进制数据了)
加减乘除运算:
int add(int x, int y) {
return x + y;
}
int sub(int x, int y) {
return x - y;
}
int mul(int x, int y) {
return x * y;
}
int div(int x, int y) {
return x / y;
}
//Func是类型名
//这个Func对应的是int(*p)(int,int)
//typedf int(*Func)(int, int);
typedef int (*Func)(int x, int y);
int main(){
//创建了一个函数指针数值,把刚才定义好的加减乘除四个函数,全部放到数组中去。
Func arr[] = {
add,
sub,
mul,
div
};
printf("请输入两个进行运算的数字:");
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
printf("请输入具体的要执行的操作:");
int op = 0;
scanf("%d", &op);
int result = 0;
result = arr[op - 1](x, y);



