• 巩固一下C语言中的指针


    今天无意间看到一篇文章《【C语言】 浅谈指针 》,对C语言指针的总结很好! 文章地址:http://blog.csdn.net/wbq1480/article/details/51506124

    写了几段代码,再巩固一下C语言知识。

    我的记忆方法跟文章中的不一样。

    *是取值符号,&取地址符号,()限定子表达式的符号,[]是按索引取数组乘员的符号。

    优先级方面()>[]>*,&。


    对于int *(*p(int))[3]; 。我是这么分析的:
    int *(*p(int))[3]=>int *p1[3]:等价于 int *p1[3]
    1、表示取p1里的某个元素是int指针,那么p1是一个数组,里面的东西全部是指针
    p1=>*p2,p2=>p(int)
    2、表示取了p2的值才是p1,显然p2也是指针(指向数组的指针);p2等效于一个函数调用,那么p一个函数

    整个表达式相当于一个函数声明,返回值是指针,指向的是数组,数组的乘员又是指针。编译之后不会产生任何代码。如果要写fuck brain的代码可以用这种方式写函数声明头文件,把别人绕晕。

    这里要特别注意返回的是指针,所以符合语法规则。如果把这个函数的返回值typedef成一个类型,那么就较容易理解了。

    如果要写这种绕脑的代码,最好typedef一下:typedef int* (*int_array_ptr)[3];。

    下面是随便写的一段代码,验证一下这个问题。

    typedef int* (*int_array_ptr)[3];//这里必须要指定长度,sizeof(int_array_ptr)才知道长度
    typedef int* int_array [];
    typedef int* (*func_ptr)(int);
    
    typedef int func_type(int);
    int* TestFunc(int a)
    {
    	printf("TestFunc
    ");
    	return 0;
    }
    
    int** TestFunc2(int a)
    {
    	printf("TestFunc2
    ");
    	return NULL;
    }
    
    int func2(int a) 
    {
    	printf("func2
    ");
    	return NULL;
    }
    
    int main()
    {
    	int *(*ps1(int))[3];
    	int *(*(ps2(int)))[3];
    
    	int a = 1;
    	int *b = &a;
    	int *c = &*b;
    	int d = *&a;
    
    	printf("a=%d
    ", a);
    	printf("*b=%d
    ", *b);
    	printf("*c=%d
    ", *c);
    	printf("d=%d
    ", d);
    
    	//int **(ps3(int))[3];
    	//int ** ps4(int)[3];
    
    	int_array_ptr ps5(int);//函数声明
    
    	//int *((*ps)(int))[3];
    	//int* (*p)(int)[3];
    
    	func_ptr func[3];//数组声明,数组的成员是函数指针
    	func_type func2;//函数声明
    	int size = sizeof(func_type*);
           int size = sizeof(func_type);//语法错误,对一个函数使用sizeof不成立 func2(3);//只有有实现的函数才能调用,如果把func2的实现删除,编译会报找不到符号 //printf("ps1=%X ", &ps1);//函数没有实现,所以ps1不存在,编译报找不到符号 //printf("ps2=%X ", &ps2);// printf("funcptr=%X ", func); printf("funcarrayptr=%X ", &func); printf("func2ptr=%X ", &func2); //memcpy(&func2,&TestFunc2,4);//不能修改代码段的数据,执行报错,&func2指向程序代码段中的地址,
            //一个程序平坦的内存被划分为代码段、数据段
    //p = func[0]; return 0; }
  • 相关阅读:
    HTTP协议中的chunked编码解析
    QP编码详解
    从新手到入门,如何进入协议分析的世界
    构造个人轻量级XSS平台获取管理员cookie并登录
    逆向分析-IDA动态调试WanaCrypt0r的wcry.exe程序
    C# 链接数据库并查询操作
    excel日期格式转换
    SAP的PI日志查看工具
    abap 动态指针理解加深ASSIGN COMPONENT
    ABAP-编程时快速带出关键字与快速注释快捷键设置
  • 原文地址:https://www.cnblogs.com/tgis/p/5531605.html
Copyright © 2020-2023  润新知