C语言指针声明探秘
来源:互联网 发布:nba2konline李慕豪数据 编辑:程序博客网 时间:2024/05/18 00:34
From:http://blog.csdn.net/liushuaikobe/article/details/8833319
前言
我对C指针的理解一直停留在:指针本身是一块内存,它保存了一块内存的地址,可以引用,但是最近在读代码的时候,各种指针的声明搞得我异常苦恼,赶紧去学习了一番,也只是明白了最基本的使用,总结如下。
基本知识
指针的基本使用正如前言中说的,先看这样一段代码:
输出结果为:
这就是指针的基本使用,可用下图来说明:
指针与数组
首先看这两个声明语句:
第一个是声明了一个指向有100个char元素的数组的指针(注意和指向数组首地址的char型指针分开);第二个是声明了一个有100个char*元素的数组,数组里面装的是char *。
为了理解,我们来看这样一段代码:
这端代码运行后结果如下:
因为内存是线性的,C中所谓的二维数组不过是数组的数组,arr这个数组有10个元素,每个元素是一个长度为100的数组,在程序员的脑子里面,arr是一个有10行100列的二维数组。
代码里的p是一个指向int型的指针,q是一个指向“有100个int的int数组”的指针。所以p和q的初始化方式是不同的,但是开始的时候他们都指向了arr这个数组的数组的首地址(初始时是相等的),但是到后面分别执行自增操作之后,因为它们的类型不同,因此根据指针自增运算的含义,他们移动的步长也不相同,p移动了sizeof(int)个字节,而q移动了sizeof(int[100])个字节,于是它们的值也大不相同,可以用下图来说明:
另外要注意的就是字符二维数组的声明:
输出结果显然:
以上是合法的字符二维数组的声明,str是一个有两个元素的数组,每个元素的类型是一个char*,结合上面所讲的,应该不难理解。
返回指针的函数和函数指针
来看下面两个声明语句:
这个应该比较好理解,类比着装有指针的数组的声明char* a[100],这是个函数声明,声明了一个名字为foo的函数,这个函数接受一个类型为int的参数,返回一个指向int型的指针。
再看下面的声明:
类比着数组的声明,这个语句声明了一个指向函数的指针bar,它指向的函数要求返回值为void,且不接受任何参数。这是一个比较简单的函数的函数指针的声明。
函数既然可以返回一个指针,那么一个函数能不能返回一个指向函数的指针呢?答案是肯定的,看,指针是多么灵活。刚刚接触可能会有点不适应,我们来看一个例子:
类比着上面的讲解,我们知道,这个语句声明了一个函数foo,它接受一个int类型的参数,返回一个指向函数的指针,要求指向的函数具有这样的形式:接受一个double类型的指针和char型的变量作为参数,返回一个int类型的值。
我们可以用C中的typedef简化这个声明:
好吧,我们接着来个更变态的,如果一个函数的参数和返回值都是函数指针,那么声明就会更复杂,例如:
其实慢点分析也不难,我们可以用typedef来简化:
signal这个函数的参数func是一个函数指针,返回了一个函数指针,且两种指针要求指向的函数具有同一种形式(接受一个int型的参数,返回空值)。
通过函数指针调用函数
还是通过一个例子来说明问题:
是不是很容易呢。注意用“&函数名”和“函数名”初始化一个函数指针都是合法的,因为C中函数名会被转换为指向这个函数的指针。
0 0
- C语言指针声明探秘
- C语言指针声明探秘
- C语言指针声明探秘
- C语言中指针探秘(一)
- C语言函数指针声明
- C语言所有复杂的指针声明
- C语言所有复杂的指针声明
- C语言指针复杂声明解析
- 再再论指针之C语言声明详解
- C语言-拾遗(2) 指针 && 声明
- 12.2 C语言指针变量的声明
- C语言小问题之-----指针声明
- C语言指针详解----指针声明定义赋值
- C语言中的高级声明--《c和指针》摘要
- C语言中的高级声明--《c和指针》摘要
- C语言中的高级声明--《c和指针》摘要
- C语言中的声明--函数声明、指针函数、函数指针、typedef
- C语言复杂指针声明应如何阅读
- AndroidManifest
- ubuntu12.4安装jdk1.6
- 浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别
- Spark资料总结
- 小结
- C语言指针声明探秘
- mysql update set where用法
- zoj1058
- JeeSite 添加新的模块与功能
- Linux中文件的隐藏权限
- @RequestBody忽略不认识的属性
- Java六大设计原则-接口隔离原则
- NGUI 图片无缝衔接
- Autocad.net 开发