巩固一下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\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;
}
巩固一下C语言中的指针的更多相关文章
- C语言中的指针数组
C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...
- 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化
C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...
- GO语言中的指针
http://www.tizgrape.com/?p=100 Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小. Go使用var定义变量: var v6 *in ...
- C语言中的指针笔记
C语言指针 得到变量的地址 可以使用&运算符找到变量保存在内存中的位置 int x = 1; printf("x的内存地址是"%p\n",&x) %p格式 ...
- C语言中的指针加减偏移量
C语言指针偏移技巧(也是一个要注意的坑) - 陈杰柱的博客 - CSDN博客 https://blog.csdn.net/cjzjolly/article/details/82116772 C语言中 ...
- C 语言中的指针和内存泄漏
引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧 ...
- C语言中的指针和内存泄漏
引言 对于任何使用C语言的人,如果问他们C语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是 ...
- C语言中的指针学习(小黑板)
指针是C语言中的精华所在,也是C语言的危险之在,今天又重现温习了一下C语言,做了一下总结. 欢迎批阅. (1)指针的含义指针的本质也是数据类型,它是指向地址的变量.例如: { int a = 10; ...
- [C]C语言中的指针和内存泄漏几种情况
引言 原文地址:http://www.cnblogs.com/archimedes/p/c-point-memory-leak.html,转载请注明源地址. 对于任何使用C语言的人,如果问他们C语言的 ...
- 论C语言中二级指针和二维数组之间的区别
刚开始学习C语言的时候,觉得一个数组可以定义一个一级指针去访问,想当然的就觉得可以定义一个二级指针去访问二维数组.很显然这是错误的. 我们来看看C语言的数组在内存中的存储方式. 实际上C语言中的数组, ...
随机推荐
- 如何在组件(Component中)模拟用户控件(UserControl)中FindForm()?
using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentM ...
- C++primer 练习15.26
定义Quote和Bulk_Quote的拷贝控制成员,令其与合成的版本行为一致.为这些成员以及其他构造函数添加打印状态的 语句,使得我们能够知道正在运行哪个程序.使用这些类编写程序,预测程序将创建和销毁 ...
- 如何实现Oracle修改用户权限 .
这里将介绍Oracle修改用户权限的实现过程,包括一些权限管理方面的东西.希望通过本文能对大家了解Oracle修改用户权限有所帮助. ORACLE数据库用户与权限管理 ORACLE是多用户系统,它允许 ...
- Log4j等级测试
一.结论: 1./**debug.info.warn.error.fatal由低到高*/ 2.注意:log.error(message,e)不会打印异常堆栈信息. 二.测试过程 1.代码 packag ...
- Android——inflate 将一个xml中定义的布局找出来
通俗的说,inflate就相当于将一个xml中定义的布局找出来. 因为在一个Activity里如果直接用findViewById()的话,对应的是setConentView()的那个layout里的组 ...
- linux中如何查看进程占用了哪些端口?
使用netstat –apn | grep <进程名>便可以查看指定进程所占用的端口.
- ZigBee无线网络技术在小区路灯照明系统的应用
小区路灯照明系统是楼宇智能的一部分,但受制于布线.成本等的问题,难以得以实施.随着计算机技术的迅猛发展,无线网络技术越来越成熟,ZigBee无线网络成本低.功耗低.传输距离远等的特点,非常适合在无线路 ...
- Flash图表控件FusionCharts如何定制图表中的趋势线和趋势区
FusionCharts中的趋势线是什么 趋势线是横跨图标的水平/垂直线条,用来表示一些预订数据值. 在图表中展示趋势线 用户可以使用<chart>元素中的trendlines属性来显示图 ...
- 慕课网-安卓工程师初养成-3-8 Java中的条件运算符
来源:http://www.imooc.com/code/1306 条件运算符( ? : )也称为 “三元运算符”. 语法形式:布尔表达式 ? 表达式1 :表达式2 运算过程:如果布尔表达式的值为 t ...
- 既约分数-phi
Description 小明正在学习分数这一章,他想知道对于一个真分数b/a而言,当分母a在[2,N]之间时,存在多少个既约分数,例如当N=4时,有以下几个1/2,1/3,1/4,2/3,3/4这五个 ...