浅谈 指针-你真的了解指针吗?
来源:互联网 发布:淘宝食品类目规则 编辑:程序博客网 时间:2024/05/22 03:54
指针
关键字:另类,新奇
最近在学习的过程中,产生了疑问,也得到了解决,对于指针的了解又上了一个层面
-----下面,我就对 (平日里以为很了解的指针)来发表一下我的一个另类的观点
请看下面代码:
#include<stdio.h>int main(){ int *p; return 0;}上述代码,我们也许会认为:这是定义了一个《指向整型变量的指针》 。
------------- 咦? 难道不都是这么理解吗? 真奇怪 ? 如果不这么理解,那么怎么理解这个问题呢?
开始抛出观点之前,我们先了解一下计算机的内存地址分配原则
内存寻址由大到小,优先分配内存地址较大的空间给变量(从下往上),先定义的变量,分配的地址越大
好了,了解了内存分配原则:我们引入正题,请看下面代码。
#include<stdio.h>int main(){ int a = 2; char c = 1; int *p = &c; printf("%d.\n",*p); return 0;}有人会对上述代码有疑问,为什么整型指针,会指向一个字符型数据的地址,编译器不会报错吗?
-------- 答案是,可能编译器会报警告。但是,并不影响我们分析指针。
首先,请看上述代码在内存中的表现形式:如下图
该代码运行结果为513
(PS:关于变量的数据内存是高字节在前低字节在后 还是低字节在前高字节在后 我们逐步讨论)
我们知道,对于指针,无论类型是int . float .short等(在32位cpu里面都是占4个字节)-- 那么疑问来了,都是占4个字节,为什么还要定义指针的类型
----- 注意:这是本文谈论的重点。
由上述代码可以看到,这个指针p指到了char数据类型的地址(这么一来,开头关于指针的理解就不完全正确), -------- 那么,该怎么理解这个指针的指向。
事实上我们不应该说成指向整型变量的指针, 而是(该指针指向了一个变量,至于什么变量我们不去管它,然后对该变量取(指针的类型【?*p】)个字节的数据,当?是 int型指针时即从上往下取4个字节)
那么取了之后会变成什么值呢? 请看下图所示 :
---- 取之后的数据为 (箭头从下往上读取)
即二进制形式为0000 0000 0000 0000 0000 0010 0000 0001(该值为513).
这就是为什么我们要求指针类型要和指向的类型配对,就是避免这种取值溢出的情况(如果指针是char *p,就只从char c的地址处开始取出1个字节(8位)的数据,刚好等于 0000 0001 ,值为c)
----现在了解了,不会再单纯的说int *p是指向整型数据的指针了吧(它是可以指向任何变量的地址,只是取值上有差异)。
分割线------------------------------------------------------------------------------------------------------------------
下面,我们来探讨一下怎么判断你的编译器对变量分配内存时是(高字节在前低字节在后) 还是 (低字节在前高字节在后)
变量的而二进制(比如short a = 2 )
在内存中二进制为 0000 0000 0000 0010 高字节在前低字节在后
还是 0000 0010 0000 0000 低字节在前高字节在后
请看下面代码:
#include<stdio.h>int main(){ short a = 2; char *p = &a; printf("%d.\n",*p); return 0;}该代码在内存中的表现形式为下图:
结合上述所讲指针内容,可得出 如果 *p = 0,则 低字节在前高字节在后
如果 *p = 2,则 高字节在前低字节在后
以上内容由本人对指针产生疑问---查阅资料----最后做出的一个另类讲解;希望对大家在学习指针的路上多多少少有所帮助。
----------------------------------------------------谢谢阅读-------------------------------------------------------------------
0 0
- 浅谈 指针-你真的了解指针吗?
- 你正真了解C语言中的指针吗
- 数组名和指针你真的懂吗?
- 你真的理解指针、数组和字符串吗?
- 测试一下你对指针的了解
- 你真的理解了数组指针和指针数组吗?
- 你真的了解宏吗:浅谈宏定义(#define语句)
- 指针的初步了解
- const指针的了解
- 你真的了解telnet吗?
- 你真的了解telnet吗?
- 你真的了解HTML吗
- 你真的了解while(n--)吗?
- 你真的了解HTML吗
- 你真的了解计算机除法吗
- 你真的了解xargs命令吗
- 你真的了解null吗?
- 你真的了解find命令吗
- ios开发之文字扩散效果
- android回调的用法
- 编译内核make menuconfig或是安霸make menuconfig_public_linux
- Android函数工具(获取App版本号)
- 引用ARC环境下的第三方时 报错
- 浅谈 指针-你真的了解指针吗?
- Android Studio五分钟带你从菜鸟到高级调试
- 神经网络与深度学习第四天读书笔记-----迈向深度学习:反向传播算法
- Android TextureView简易教程
- tjut 1542
- 利用MOG2背景模型提取运动目标的OpenCV代码
- 网络工程1.14——网际层
- 一维费用的背包问题模板
- ORA-30009: Not enough memory for CONNECT BY operation