栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言---指针的进阶

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言---指针的进阶

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);

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/346842.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号