C指针与地址
C指针与地址
在C语言的学习过程中,常理不清指针(即一个变量的地址)和指针变量(专门用来存放另一变量的地址(指针)的变量)的关系,因此通过程序打印地址运行结果,来分析加强理解。以此记录学习过程中的心得,希望能帮到大家,感谢指正。
前言
一、代码示例
代码如下:
1 |
|
2.运行结果
代码如下:
1 | 000000000061FE1C |
总结
在指针*p=&a初始化后,p等同于&a即a的地址,在运行过程中可以代换。%#p是输出位0X开开头的16进制数。因此printf(“%p\n”,&a); printf(“%#p”,p);本质是一样的。*p则是通过指针变量p存储的a的地址,间接获取a的值。*p=a,对数值%p等同于对数值以十六进制位输出。%d对p,*p,&p则是以十进制形式分别输出地址,值,地址。
p–,由于p是整型指针,p–减去int的4个字节刚好移动到b。
【注】1.这里发现后定义的变量b的地址要小于a的地址,这是因为c语言中,先定义的数据先入栈,在栈的底部(不分配内存),声明结束后,b在栈顶,所以b先出栈,先为b分配内存。因此b的地址小于a的地址。
2.数据的地址位数和数据能存储的位数无关。学习阶段曾存在疑问(输出的地址是16位,int是4字节,即16进制的4位代表一个字节(实际应该是一个字节等于2位16进制),一个字节等于八位二进制,但八位二进制不等于四位16进制?)通过交流请教得知有关计算机组成原理,地址位数只取决于系统,所有类型的指针所占长度相同。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 少年没有乌托邦!
评论