前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >探索变量与指针的关系——从内存中观察

探索变量与指针的关系——从内存中观察

作者头像
xxpcb
发布2020-11-05 10:51:10
4380
发布2020-11-05 10:51:10
举报
文章被收录于专栏:码农爱学习的专栏

C语言中,指针是很重要的一个功能,但想要用好指针却不是一件容易的事,本篇从内存存储的数据出发,通过对比变量与指针在内存中究竟是怎么存储的,来对指针有一个直观的认识。

首先明确一个概念:变量,存储的是数值,而指针,是一种特殊的变量,它存储的是地址形式的数值。

下面编写一个测试程序来验证一下,该程序定义了一些变量与指针,另外,还使用malloc函数来动态申请内存(普通变量是存储在栈区,动态申请的变量在堆区,通过打印其内存地址可以看出差别)。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a = 0xFF01; //变量,存储的是数值 (0xFF01=65281)
    char b = 23;
    int *p1 = &a; //指针,存储的是地址(一种特殊的数值)

    short *p3;

    char *p2;
    char arr[3] = {7,8,9};
    p2 = arr;

    p3 = (short*)malloc(3*sizeof(short));//动态分配
    p3[0] = 0x110a;
    p3[1] = 0x220b;
    p3[2] = 0x7fff;
 

    printf("int a的内存地址: &a = %#x\r\n", &a);
    printf("int a存储的值: a = %#x\r\n", a);
    printf("\r\n");

    printf("char b的内存地址: &b = %#x\r\n", &b);
    printf("char b存储的值: b = %#x\r\n", b);
    printf("\r\n");

    printf("指针int *p1的内存地址: &p1 =  %#x\r\n", &p1);
    printf("指针int *p1存储的值: p1 = %#x\r\n", p1);
    printf("指针int *p1指向的地址的值: *p1 = %#x\r\n", *p1);
    printf("\r\n");

    printf("指针char *p2的内存地址: &p2 = %#x\r\n", &p2);
    printf("指针char *p2存储的值: p2 = %#x\r\n", p2);
    printf("指针char *p2指向的地址的值: *p2 = %d\r\n", *p2);
    printf("\r\n");

    printf("数组arr[3]的内存地址: &arr = %#x\r\n", &arr);
    printf("数组元素arr[0]的内存地址: &arr[0] = %#x\r\n", &arr[0]);
    printf("数组元素arr[1]的内存地址: &arr[1] = %#x\r\n", &arr[1]);
    printf("数组元素arr[2]的内存地址: &arr[2] = %#x\r\n", &arr[2]);
    printf("\r\n");

    printf("指针short *p3的内存地址: &p3 = %#x\r\n", &p3);
    printf("指针short *p3存储的值: p3 = %#x\r\n", p3);
    printf("指针short *p3指向的地址的值: *p3 = %d\r\n", *p3);
    printf("指针short *p3 malloc的p3[0]的内存地址: &p3[0] = %#x\r\n", &p3[0]);
    printf("指针short *p3 malloc的p3[1]的内存地址: &p3[1] = %#x\r\n", &p3[1]);
    printf("指针short *p3 malloc的p3[2]的内存地址: &p3[2] = %#x\r\n", &p3[2]);
    printf("\r\n");

    return 0;
}

测试程序输出如下结果:

通过VC6.0软件的调试功能,可以查看内存中的内容:

为便于分析,我做了一张对照图,如下:

可以看到:

  • 普通变量在内存存储的是变量的值,指针存储的是指针性变量,即其它变量的地址,如图中的蓝色箭头
  • 变量是以小端方式存储的(关于大小端的存储方式,可参考之前的文章:C语言打印数据的二进制格式-原理解析与编程实现
  • 普通变量存储在栈区,栈的内容向下生长,动态分配的变量在堆区,堆的内容向上生长
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农爱学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档