博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
巩固一下C语言中的指针
阅读量:6305 次
发布时间:2019-06-22

本文共 1736 字,大约阅读时间需要 5 分钟。

今天无意间看到一篇文章《》,对C语言指针的总结很好! 文章地址:

写了几段代码,再巩固一下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\n");	return 0;}int** TestFunc2(int a){	printf("TestFunc2\n");	return NULL;}int func2(int a) {	printf("func2\n");	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\n", a);	printf("*b=%d\n", *b);	printf("*c=%d\n", *c);	printf("d=%d\n", 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\n", &ps1);//函数没有实现,所以ps1不存在,编译报找不到符号	//printf("ps2=%X\n", &ps2);//	printf("funcptr=%X\n", func);	printf("funcarrayptr=%X\n", &func);	printf("func2ptr=%X\n", &func2);	//memcpy(&func2,&TestFunc2,4);//不能修改代码段的数据,执行报错,&func2指向程序代码段中的地址,         //一个程序平坦的内存被划分为代码段、数据段 	//p = func[0];    return 0;}

 

转载于:https://www.cnblogs.com/tgis/p/5531605.html

你可能感兴趣的文章
Android 类库书签更新(一)
查看>>
Unity3D Input按键系统
查看>>
简单的一条SQL,不简单的做事思维 NOT IN 、NOT EXISTS、LEFT JOIN用法差别 ...
查看>>
DataWorks:任务未运行自助排查
查看>>
ionic/cordova热部署
查看>>
「镁客早报」特斯拉裁员,马斯克解释没有办法;微软推出Azure DevOps赏金计划...
查看>>
Flink入坑指南第五章 - 语法糖 view
查看>>
centos 7.4 使用 pgxc_ctl 安装与使用
查看>>
Redis 单key值过大 优化方式
查看>>
【数据库】表分区
查看>>
nutz-sqltpl 1.3.4.RELEASE 发布,在 Nutz 项目中“解决 Java 拼接 SQL”问题
查看>>
城市 | 800个地铁站数据透析的京沪白领图鉴:隐形土豪、无产中产阶级和猪猪女孩...
查看>>
前端脚本!网站图片素材中文转英文
查看>>
linux的常用易忘命令
查看>>
PHP 分割字符串
查看>>
java 基于QRCode、zxing 的二维码生成与解析
查看>>
关于职业规划的一些思考
查看>>
img垂直水平居中与div
查看>>
Fabrik – 在浏览器中协作构建,可视化,设计神经网络
查看>>
防恶意注册的思考
查看>>