巩固一下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语言中的数组, ...
随机推荐
- Intellisense in Visual Studio for Microsoft Dynamics CRM 2016
Intellisense in Visual Studio for Microsoft Dynamics CRM 2016 posted by dynamicsnick on may 18, 2016 ...
- javascript 传递引用类型参数
JavaScript代码如下: function setName(obj){ obj.name = "test1"; obj = new Object(); obj.name = ...
- MySQL数据的主从复制、半同步复制和主主复制详解-转
一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费 ...
- python3 split( ) not enough values to unpack(expceted 2, got 1)
在运行一个小脚本时,脚本从一文本文件读取数据,事实上这个文件只有一行'count:2',并取到这个2,将其转成数字.但运行,总是报错. 代码如下: with open('count.txt', 'r' ...
- bochs安装一系列问题
http://blog.chinaunix.net/uid-23817499-id-3418083.html http://www.mouseos.com/os/tools/bochs.html ...
- 简洁之美 -约瑟夫环的python 解法
问题描述: 约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到k的那个人出列:他的下一个人又从1开始报数,数到k的那个人又出列:依此规律重复下 ...
- Android Activity 详述
activity类处于android.app包中,继承关系: extends ContextThemeWrapper implements LayoutInflater.Factory2 Window ...
- Yii 中比较常用的rules验证规则记录
查看代码 打印 01 return array( 02 03 //必须填写 04 array('email, username, password,agree,verifyPa ...
- 分层服务提供者(LSP)
分层服务提供者(LSP)(1) 开发过滤数据包的LSP程序可以定义过滤规则,恩,先看看LSP本身是DLL,可以将它安装至Winsock目录,创建套接字的应用程序不必知道此LSP的任何信息就能调用它 1 ...
- .NET本质论(4)应用程序对象HttpApplication
当HttpContext对象创建之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplication. 在ASP.NET内部,HttpRuntime管理一个定 ...