C语言笔记之指针(二)

news2024/11/18 23:44:18

前言

本文主要介绍指针与内存和地址的关系,指针与内存关系深入解析,包括占用大小、动态分配,提醒使用sizeof()注意点。仅供大家参考学习,若有错换之处,欢迎交流指导~


指针在不同位数电脑中的内存占用

在上图左边可以看出,不同位数的电脑中,指针本身所占的内存空间大小也不同.

  • 32位的电脑中,单个变量共有2^32种位置供存储数据,而指针为了能够找到该变量,则值的取值范围为0~2^32,也就是需要4个字节的内存空间大小.
  • 64位的电脑中,单个变量共有2^64种位置供存储数据,而指针为了能够找到该变量,则值的取值范围为0~2^64,也就是需要8个字节的内存空间大小.

内存分配与指针关系

假如我们使用malloc()函数申请内存空间

int *a=malloc(sizeof(int)*6);

那么指针所存储的地址为申请的内存空间的首个地址,也就是a&a[0]相等,正如图中右边所示.因为a是指针所指向的地址,而&a[0]是指向地址的首地址,故两者相等.

内存大小计算注意事项

假如我们使用sizeof()去计算内存空间大小

int size=sizeof(a);

实际计算的是指针a的所占内存空间大小,而不是a[0]a[5]的内存空间大小.正如下面的代码中的指针,无论你用malloc()分配多大的内存,两者用sizeof()计算的大小都是一致的.

int *a=malloc(sizeof(int)*1);
int *b=malloc(sizeof(int)*2);

因为当你使用free()释放内存空间时,指针本身的内存空间还是会存在的,所以在释放后用sizeof()去测量内存时,其值仍问指针本身的内存空间,也就是图中的左边部分.


相关代码

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    /** number0,number2进行赋值操作,number1,number3不赋值 **/
    int number0[3];
    int number1[3];
    int *number2 = malloc(sizeof(int) * 3);
    int *number3 = malloc(sizeof(int) * 3);

    /** 未赋值前指针所占空间大小 **/
    printf("number2内存空间为%d,\nnumber3内存空间为%d\n\n", sizeof(number2), sizeof(number3));

    /** 赋值操作 **/
    for (int i = 0; i < 3; i++)
    {
        number0[i] = i;
        number2[i] = i;
    }

    printf("number0所占内存大小为%d,\nnumber1所占内存大小为%d,\nnumber2所占内存大小为%d,\nnumber3所占内存大小为%d\n\n", sizeof(number0), sizeof(number1), sizeof(number2), sizeof(number3));
    /**  内存空间大小不随存储数据值的大小而变化 **/
    for (int i = 0; i < 3; i++)
    {
        number0[i] = 1 << 31 - 1;
        number2[i] = 1 << 31 - 1;
    }
    printf("number0所占内存大小为%d,\nnumber2所占内存大小为%d\n\n", sizeof(number0), sizeof(number2));
    /** 检测number2数组元素是否溢出 **/
    for (int i = 0; i < 3; i++)
    {
        printf("number2[%d]=%d\n", i, number2[i]);
    }
    free(number2);
    free(number3);
    number2 = NULL;
    number3 = NULL;
    /** 检测是否释放完指针
     *  问题:运行后发现并没有释放完指针
     *  分析:这是因为free()函数取消给该指针存储的内存空间,但是指针本身的内存空间并没有取消,
     *  所以sizeof()函数依然可以检测到指针的内存空间大小
     */
    printf("\nnumber2所占内存大小为%d,\nnumber3所占内存大小为%d\n\n", sizeof(number2), sizeof(number3));

    /** 改变动态分配的内存
     * 结论:动态分配不改变指针本身的内存空间大小,但是可以改变指针指向的内存空间大小
     * sizeof()函数检测的是指针本身的内存空间大小,
     * 无论是改变指针指向的地址还是改变指针指向的内存空间大小,
     * 都不会改变指针本身的内存空间大小
     **/
    number2 = malloc(sizeof(int));
    number3 = malloc(sizeof(int) * 2);

    printf("number2所占内存大小为%d,\nnumber3所占内存大小为%d\n\n", sizeof(number2), sizeof(number3));
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1109781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重学前端-js类型

javascript目前位置一共有7种数据类型&#xff0c;分别为&#xff1a; Undefined&#xff1b;Null&#xff1b;Boolean&#xff1b;String&#xff1b;Number&#xff1b;Symbol&#xff1b;Object。 Undefined与Null Undefined 类型表示未定义&#xff0c;它的类型只有一个…

1455. 检查单词是否为句中其他单词的前缀

1455. 检查单词是否为句中其他单词的前缀 JS代码&#xff1a;js就很便捷&#xff01;startsWith() /*** param {string} sentence* param {string} searchWord* return {number}*/ var isPrefixOfWord function(sentence, searchWord) {let arr sentence.split( );for (let …

JavaScript处理按键事件-模态窗口

上一节中我们基本实现了模态窗口的功能&#xff0c;本文将介绍我们可以通过用户的按键然后去执行一些事情 document.addEventListener(keydown,function() {console.log("我按下了一个按键"); })这段代码会添加一个事件监听器&#xff0c;当有键盘按键被按下时&#…

权威认证!海云安获得数据安全服务能力评定资格证书

为切实提升数据安全保障能力&#xff0c;加速推进国家数据安全建设&#xff0c;中国计算机行业协会数据安全专业委员会依托能力评价工作组从数据安全评估和数据安全建设两个方面开展了数据安全服务能力评定。 经过自主申报、专家评审等程序&#xff0c;深圳海云安网络安全技术…

TCP/IP(二十二)TCP 实战抓包分析(六)TCP 快速建立连接

一 TCP Fast Open 快速建立连接 说明&#xff1a; 之前讲解TCP 相关知识点遗漏了这个知识点,补充上 ① TFO简介 ② 请求 Fast Open Cookie过程 "原理图" ③ 真正开始 TCP Fast Open 重点&#xff1a; TFO 使 SYN包 可以包含payload 数据 ④ 抓包分析 1、…

使用单个mybatis框架进行mysql数据库的连接和操作?

使用单个mybatis框架进行mysql数据库的操作&#xff1f; 简述 先来说一下数据库连接的演变&#xff0c;刚开始的时候&#xff0c;最原生的连接并操作mysql数据库的办法是使用JDBC技术&#xff0c;这种技术相对来说写的源码比较多&#xff0c;比较繁杂&#xff1b; 后来就出现…

第十六届中国智慧城市大会 | 国产化三维重建技术服务智慧城市建设

2023年10月13日&#xff0c;由武汉大势智慧科技有限公司、飞燕航空遥感技术有限公司主办的第十六届智慧城市大会-实景三维技术创新与应用论坛在广州成功举办。 来自实景三维、自然资源、数字孪生、AI大数据、航空遥感等多个领域的专家&#xff0c;深度分享各自的智慧城市建设经…

【2023双十一新玩法】如何快速让数据达到预期目的,让销售额提升10倍,客群提升10倍,销量提升10倍

2023年的双十一即将到来&#xff0c;商家们依然在为销售目标而努力&#xff0c;而数据分析就成为了其中不可或缺的一环。大大小小的企业都纷纷采用了数据分析来提高销售效率&#xff0c;而老板们也都习惯了看着大屏幕上的实时数据。 然而&#xff0c;对于员工而言&#xff0c;做…

在线商城系统软件、源码、报价_OctShop

随着互联网、5G、人工智能的快速发展&#xff0c;人们在家购物已经是生活的重要方式。各种在线商城系统的不断涌现&#xff0c;同时&#xff0c;也给传统的企业商家销售带来了不小的压力&#xff0c;那么&#xff0c;如何调整&#xff0c;以适应时代的发展呢&#xff1f;经过不…

把Resources目录标记为Resource Root目录才能找到文件?

把Resources目录标记为Resource Root目录才能找到文件&#xff1f; mybatis配置文件中配置的mapper.xml映射文件找不到&#xff1f;这是为什么呢&#xff1f;因为你当resources目录不是根目录&#xff0c;重新标记成根目录就可以了&#xff0c;如下图&#xff1a;

Java项目-网页聊天程序

目录 项目介绍 项目功能简介 项目创建 用户管理模块 1.数据库设计及代码实现 2.前后端交互接口的设计 3.服务器代码开发 好友管理模块 数据库设计 好友表设计的两个重要问题 设计前后端交互接口 服务器代码 会话管理模块 会话的数据库设计 获取会话信息 约定前后…

VisualStudio 远程Debug

注意&#xff1a;纯靠记性&#xff0c;可能实际有出入。 1.连接本地电脑和远程电脑&#xff0c;我是通过ToDesk软件进行桌面连接的。 2.本地运行的项目&#xff0c;把项目打包后拷贝到远程电脑。 3.打开本地VisualStudio的安装位置&#xff0c;有个文件夹叫Remote Debugger。把…

深入研究Java线程Dump分析:掌握发现和解决多线程问题的关键技巧

1 Thread Dump介绍 1.1 什么是Thread Dump Thread Dump是非常有用的诊断Java应用问题的工具。每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力&#xff0c;虽然各个 Java虚拟机打印的thread dump略有不同&#xff0c;但是大多都提供了当前活动线程的快…

“乘风而上,谋远共赢”润和软件HopeStage2023秋季渠道商会议圆满举行 润和软件 润和软件

10月18日&#xff0c;由江苏润和软件股份有限公司&#xff08;以下简称“润和软件”&#xff09;主办的HopeStage2023秋季渠道商会议圆满举行。本次会议以“乘风而上&#xff0c;谋远共赢”为主题&#xff0c;汇聚众多HopeStage渠道商与生态合作伙伴&#xff0c;共谋国产基础软…

怎么把本机设置成代理ip?

代理IP服务能帮助您隐藏您的真实IP&#xff0c;从而保护您的隐私和安全。本文将指导您如何将本机设置为代理IP。代理IP服务能帮助您隐藏您的真实IP&#xff0c;从而保护您的隐私和安全。本文将指导您如何将本机设置为代理IP。设置代理IP可以用于多种用途&#xff0c;比如&#…

进程相关内容(三)

目录 进程优先级 进程饥饿 Linux当中优先级标识符 优先级的修改参数NI 进程最终优先级 修改进程的优先级 操作系统实现优先级的方法 位图 并发的概念 进程切换原理 环境变量 其他环境变量 获得环境变量的方式 getenv系统调用函数 命令行参数 本地变量 export添加环境变量 unset…

修改echarts的tooltip样式 折线图如何配置阴影并实现渐变色和自适应

图片展示 一、引入echarts 这里不用多解释 vue里使用 import echarts from “echarts”; html页面引用js文件或用script标签引用 二、定义一个具有宽高的dom div <div id"echart-broken" style"width:400px;height: 200px;"></div>三、定义…

头歌平台——基于数组的工资处理系统

第1关&#xff1a;数据输入和计算 任务描述 本关任务&#xff1a; 编写函数input_data(char uid[10][5], int salary[10], int csalary[10], int revenue[10], int _water_electricity[10], int _deductions[10])&#xff0c;作用为输入职工的代号&#xff0c;岗位工资&#…

LabVIEW应用开发——控件的使用(二)

上篇介绍数值型控件和布尔型控件&#xff0c;这篇介绍字符串、路径控件、下拉框和数组控件。 LabVIEW应用开发——控件的使用&#xff08;一&#xff09; 1、字符串控件 实际应用中&#xff0c;字符串控件的显示很常用的&#xff0c;可用于显示串口信息、通讯交互信息、…

JAVA-记一次BigDecimal,String千分位转换

在显示类上面添加JsonSerialize注解&#xff0c;指定对应的转换格式例如&#xff0c;同理可在属性为BigDecimal的字段上添加注解&#xff0c;指定方法&#xff1a; private String userTypeStr;/*** 交易金额*/JsonSerialize(using StringSerialize.class)private String tran…