来源 :https:///language/c/c_and_pointer.md#%E6%8C%87%E9%92%88 指针本文介绍C语言的指针相关知识. 指针是什么?指针和其他的int, float等类似, 是一种类型. 有类型就有相应类型的变量和常量. 本文主要讨论变量的情况. 指针变量就是一种变量, 和其他种类的变量类似, 但指针和其他变量又有区别. 首先C语言作为一种类型语言, 每个变量都会有几个属性.
例如 也就是说, 任何时候看到一个变量, 就会有这3个属性. 对于指针变量, 可以认为有4个属性.
可以看到指针变量的关键在于指针所指向的内存里面数据的类型. 例如 任何时候看到一个指针就需要关注4点内容: 名称, 指针类型, 指针值, 指向类型. 搞清楚这几个内容, 就可以弄明白指针怎么回事, 当然还要记忆 一些例外的情形. 类型对于C语言来说, 搞清楚变量的类型相当重要, 涉及到指针的时候就更加重要. 看到一个指针变量后需要理解其指向类型. 例如 如果看到一个变量的声明或者定义, 那么就需要弄明白变量的类型. 在 理解类型的规则
char * const * (*next)() 按照上面的规则来理解next的类型
整个来说: next是一个指针, 指向一个函数, 函数的返回值也是一个指针, 指向一个类型为char的常量指针. 更详细的可以参考 类型有什么用?C语言为类型语言, 即每个变量都有类型. 类型在变量的赋值, 函数传参, 编译检查等等方面都会用到. 类型可以确定数据的大小和操作. 例如
那么对于指针来说, 其指向类型就非常重要, 指向类型就规定了指针的值所指向的内存的数据是什么类型, 也就是占用多大内存, 可以进行什么操作. sizeof只要类型确定, 那么便可以用sizeof计算类型占用的内存大小, 这个是编译阶段便可以确定的. 对于指针类型来说, 所有指针类型占用的内存大小基本都是一样的, 例如在32bit的机器上占用4字节, 在64bit的机器上占用8字节. 下面代码的变量a和变量b都是指针类型, 但是指向类型不同. 因此sizeof(a)和sizeof(b)的值相等, 但是sizeof(*a)和sizeof(*b)不相等.
指针类型的操作可以对指针变量进行 double a[3] = {1, 2, 3}; 运行结果
可以看到b+1的值比b要大8. d+1的值比b要大4. b+1实际上是指向a[1]的内存地址. d+1是指向c[1]的内存地址. 有如下公式成立, 指针做加法后的指针变量值和指向类型占用的内存大小相关. 指针变量 + 数字 = 指针变量值 + 数字 * sizeof(指向类型) 可以看到指向类型除了告诉你指针指向的内存里面的数据类型, 在指针变量的相关运算上也是有用的. 数组类型数组与指针有一定的相似, 同时又很不一样. 数组与指针的关键区别在于数组名是一个常量(和const常量不同). const常量表示变量的内容不会变化, 实际上还是一个变量. 这里所说的数组名为一个常量, 可以理解数组名称是一个内存地址值, 例如0×7fff5f9ec7d4. 以下面的例子来说, a本身不会占用内存, 占用内存的是a[0], a[1], a[2], 实际上a所表示的这块内存才是数组变量. int a[10] = {0}; 那么 执行 执行 数组的其他几个需要注意的地方
可以看到有的时候a看作一个数组(例如sizeof(a)是计算数组的内存占用), 有时候a看作一个地址常量(例如计算sizeof(*a)和a+1的时候). 还有的时候完全是比较特殊的使用(例如&a得到的指向类型为 函数指针函数名本身也是一个地址常量, 其指向类型为一个函数. 实际指向的是函数在内存中的指令集合的起始位置.
输出值如下: 1, 1, 8
以上几点可以认为是函数的特殊情形, 直接记忆. 可以将函数的指令看作是一个unsigned char []的数组. 这样函数名就好像是一个数组名一样, 都是地址常量, 其指向类型为unsigned char类型. 但是函数指令的数组的长度是未知的, 因此编译器默认输出sizeof(foo)为1, sizeof(*foo)相当于是sizeof(unsigned char)为1. 强制类型转换很多时候涉及到指针和强制类型转换就会感觉比较麻烦, 实际上只要抓住类型这个关键点也可以很简单. 强制类型转换的关键是一段内存, 这段内存里面的数据你把它当作什么类型来看待.
那么变量a有一段内存(8个字节), 里面存储了23.456(按标准浮点格式存储). 然后指针b指向这段内存, 而且指针b的指向类型是int, 因此指针b认为这段内存里面存储的是一个int类型的数据. 小结本文内容不算全面, 但关键点都有. 每次看到指针的时候, 记住4个特征, 不管如何进行类型转换, 多少级指针, 是否包含函数指针等, 看到指针 就思考下面4点, 尤其是3,4. 练习多了之后就会发现指针本身不是很难, 难的是怎么判断数据的类型.
|
|
来自: 西北望msm66g9f > 《编程》