C程序设计——指针杂谈0

news2024/9/21 16:41:13

变量和常量讲的差不多了,这里先把指针再深入理解一下,如果你是C语言初学者,本节可能看不太懂,没关系可以以后再看。

变量

当定义变量的时候,本质是在内存中分配了一段空间,这段空间的大小与变量的类型相关,C语言中,用sizeof(),可以求出各种类型变量空间大小(字节数):

int main(void)
{
    int iSize ;
    iSize = sizeof(char);
    printf("sizeof(char) is          %d\r\n", iSize);

    iSize = sizeof(short int);
    printf("sizeof(short int) is     %d\r\n", iSize);

    iSize = sizeof(int);
    printf("sizeof(int) is           %d\r\n", iSize);

    iSize = sizeof(long int);
    printf("sizeof(long int) is      %d\r\n", iSize);

    iSize = sizeof(long long int);
    printf("sizeof(long long int) is %d\r\n", iSize);

    iSize = sizeof(float);
    printf("sizeof(float) is         %d\r\n", iSize);

    iSize = sizeof(double);
    printf("sizeof(double) is        %d\r\n", iSize);

    printf("\r\n\r\n");

    iSize = sizeof(unsigned char);
    printf("sizeof(unsigned char) is          %d\r\n", iSize);

    iSize = sizeof(unsigned short int);
    printf("sizeof(unsigned short int) is     %d\r\n", iSize);

    iSize = sizeof(unsigned int);
    printf("sizeof(unsigned int) is           %d\r\n", iSize);

    iSize = sizeof(unsigned long int);
    printf("sizeof(unsigned long int) is      %d\r\n", iSize);

    iSize = sizeof(unsigned long long int);
    printf("sizeof(unsigned long long int) is %d\r\n", iSize);

    printf("\r\n\r\n");

    iSize = sizeof(char*);
    printf("sizeof(char*) is          %d\r\n", iSize);

    iSize = sizeof(short int*);
    printf("sizeof(short int*) is     %d\r\n", iSize);

    iSize = sizeof(int*);
    printf("sizeof(int*) is           %d\r\n", iSize);

    iSize = sizeof(long int*);
    printf("sizeof(long int*) is      %d\r\n", iSize);

    iSize = sizeof(long long int*);
    printf("sizeof(long long int*) is %d\r\n", iSize);

}

运行结果如下:

说回指针,从上面的打印,我们可以看出,在我电脑上,指针类型的长度都是8字节。在这里我可以给大家一个结论,只要计算机确定了,指针类型的长度是确定的,指针变量的长度只可能是1、2、 4、8中的一个,与内核的地址空间相关。如果地址空间不超过256字节,那么指针变量的长度就是1;如果地址空间不超过64K字节,那么指针变量的长度就是2;地址空间不超过4G字节 ,指针长度就是4字节;地址空间超过4G字节 ,指针长度就是8字节。地址空间 8字节都表示不了的计算机,目前还没有被设计出来,所以指针长度 8 字节就到头了,不可能再大了。

变量的空间是由编译器和操作系统,按照既定的算法分配的,对程序员透明,如果没有指针,程序员,就只能访问自己定义的变量,即无法访问变量以外的内存空间。

指针所能实现的需求

通常,当你做底层开发时,需要按照芯片手册,访问特定地址的数据:

STC 89C51 单片机的串口控制器

上图是STC 89C51单片机,串口控制器的寄存器列表。表格的第二行,我们可以看出:SCON是一个8位的寄存器,地址是 0x98(98H 的后缀 H,表示98是个16进制数)。如果我们要访问 SCON,肯定不能直接 char SCON,因为定义变量,不能指定 SCON 的地址。怎么办呢?有一种实现方式是(这里 volatile 超纲了,先记住这个单词,具体含义,后面再讲):

int main(void)
{
    /* 因为 SCON 是一个8位的寄存器,
    因此定义一个无符号 char 型的指针。
    */
    volatile unsigned char *SCON;
    SCON = 0x98;
    printf("%x", *SCON);
}

 

指针定义时的一些细节

下面这个代码,定义了一个无符号 char型的指针,表示指针的 “*”,是用来修饰 “SCON”的,而不是修饰类型 “unsigned char” 。

int main(void)
{
    unsigned char *SCON;
}

因此下面这个代码中,SCON 是 unsigned char 类型的指针,它的长度应该是8;cC是 unsigned char 类型的变量,它的长度应该是 1 。

int main(void)
{
    int iSize ;
    unsigned char *SCON, cC;
    iSize = sizeof(SCON);
    printf("sizeof(SCON) is   %d\r\n", iSize);

    iSize = sizeof(cC);
    printf("sizeof(cC) is     %d\r\n", iSize);
}

所以上面代码的运行结果是下面这样:

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

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

相关文章

GD - EmbeddedBuilder - 给已有工程换MCU

文章目录 GD - EmbeddedBuilder - 给已有工程换MCU概述不行的重现 笔记工程的.gdc文件内容中有MCU型号可以改 给已有工程换MCU的使用场景END GD - EmbeddedBuilder - 给已有工程换MCU 概述 一个现存的EmbeddedBuilder的工程,想换个MCU配置做实验,又不想…

极盾故事|某金融租赁机构应用数据保护新策略:“动态脱敏”“二次授权”

数据的流通使用是创新的动力,但安全和合规是不可逾越的底线。企业如何在这三者之间找到平衡点? 极盾科技,助力某金融租赁机构,基于极盾觅踪构建应用数据动态脱敏系统,实现10+核心应用系统的统一管理&#x…

库(Library)

库的定义 在Linux操作系统中,库(Library)是一段编译好的、可重用的代码,它能够被其他程序或应用程序在运行时调用。库可以提高代码的模块化,使得开发者可以共享和重用代码,从而提高开发效率,减少…

如何在 Ubuntu 24.04 上安装 MariaDB ?

MariaDB 是一个流行的开源关系数据库管理系统,它是 MySQL 的一个分支,它被广泛用于存储和管理数据。本指南将引导您完成在 Ubuntu 24.04 上安装 MariaDB 的步骤。 Step 1: Update Your System 首先更新系统,确保所有的软件都是最新的。 su…

PMP–一、二、三模、冲刺、必刷–分类–14.敏捷–技巧–刺探

文章目录 技巧一模反例不选“刺探”14.敏捷--流程:(2)每日站会(15分钟、轮流开、提出问题、不解决问题):输入任务板/看板 → 输出任务板更新、燃尽图更新、障碍日志、产品增量;14.敏捷--方法--每…

树莓派扩展RGB点阵屏的使用

本篇来介绍一个树莓派的RGB 8x8点阵屏扩展板的使用。 1 RGB点阵屏 这里使用SunFounder的一个RGB 8x8树莓派扩展板,将其插接到树莓派中即可使用。 2 树莓派IIC配置 树莓派系统的安装,可参考之前的文章: 这个RGB点阵屏与树莓派直接使用IIC通…

Opencv中的直方图(2)计算图像的直方图函数calcHist()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算一组数组的直方图。 函数 cv::calcHist 计算一个或多个数组的直方图。用于递增直方图bin的元组的元素是从相同位置的相应输入数组中获取的。…

C++设计模式——Template Method模板方法模式

一,模板方法模式的定义 模板方法模式是一种行为型设计模式,它先定义了一个算法的大致框架,然后将算法的具体实现步骤分解到多个子类中。 模板方法模式为算法设计了一个抽象的模板,算法的具体代码细节由子类来实现,从…

Spring Boot中如何禁用Actuator端点安全性?

Spring Boot中如何禁用Actuator端点安全性? 1、为什么考虑禁用?2、如何禁用?方法一:自定义Security配置(推荐)方法二:绕过安全性(不推荐) 3、注意事项4、总结 &#x1f4…

Golang | Leetcode Golang题解之第393题UTF-8编码验证

题目&#xff1a; 题解&#xff1a; const mask1, mask2 1 << 7, 1<<7 | 1<<6func getBytes(num int) int {if num&mask1 0 {return 1}n : 0for mask : mask1; num&mask ! 0; mask >> 1 {nif n > 4 {return -1}}if n > 2 {return n}r…

AI机械键盘,罗技推出首款AI机械键盘K98M

在这个智能化日益普及的时代&#xff0c;我们的生活中充斥着各种智能设备。 从智能手机到智能家居&#xff0c;现在连键盘也加入了智能化的行列。罗技&#xff0c;作为知名的电脑配件制造商&#xff0c;最近推出了他们的首款AI机械键盘K98M。这款键盘集成了百度文心一言提供的…

C++设计模式——Observer观察者模式

一&#xff0c;观察者模式的定义 观察者模式是一种行为型设计模式&#xff0c;又被称为"发布-订阅"模式&#xff0c;它定义了对象之间的一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会收到通知并自动更新。 观察者模式…

13、Django Admin创建两个独立的管理站点

admin文件 from .models import Epic, Event, EventHero, EventVillain from django.contrib.admin import AdminSiteclass EventAdminSite(AdminSite):site_header "Events管理"site_title "欢迎您&#xff01;"index_title "管理员"even…

AI自动生成PPT哪个软件好?如何自动生成专业级PPT?

新学期伊始&#xff0c;准备开学演讲稿的你是否还在为制作PPT而烦恼&#xff1f;别担心&#xff0c;现在有了AI的帮助&#xff0c;生成专业且吸引人的PPT变得轻而易举。 本文将为你揭秘4种高效的AI自动生成PPT的方法&#xff0c;让你在新学期的演讲中脱颖而出。无论是简洁明了…

畅游5G高速网络:联发科集成Wi-Fi6E与蓝牙5.2的系统级单芯片MT7922

这周末,除非外面下钞票,否则谁也拦不住我玩《黑神话悟空》(附:两款可以玩转悟空的显卡推荐) IPBrain平台君 集成电路大数据平台 2024年09月03日 17:28 北京 联发科一直以创新技术追赶市场需求…… “不努力向前游就会被海浪拍回岸边…” 芯片设计公司产品层出不穷,想要站…

Redis集群搭建以及用idea连接集群

一、redis的集群搭建&#xff1a; 判断一个是集群中的节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,那么当前节点就是挂掉了,所以搭建redis集群时建议节点数最好为奇数&#xff0c;搭建集群至少需要三个主节点,三个从节点,至少需要6个节点。…

Datawhle X 李宏毅苹果书AI夏令营深度学习笔记之——卷积神经网络

卷积神经网络简介 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种深度学习模型&#xff0c;尤其擅长处理图像和视频等高维度的数据。CNN 通过模仿人类视觉系统的工作方式&#xff0c;自动学习数据中的空间层次结构&#xff0c;使得它在计算机视…

我找到了一个让ChatGPT稳定通过草莓测试的方法,百试百灵!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

windows C++ 并行编程-并发和UWP(三)

控制执行线程 Windows 运行时使用 COM 线程模型。 在此模型中&#xff0c;根据对象处理其同步的方式&#xff0c;对象被托管在不同的单元中。 线程安全对象托管在多线程单元 (MTA) 中。 必须通过单个线程访问的对象托管在单线程单元 (STA) 中。 在具有 UI 的应用程序中&#…

系统找不到指定的文件怎么解决?

把U盘插在电脑上&#xff0c;当我打开U盘中的文件时&#xff0c;弹窗提示系统找不到指定的文件&#xff0c;这是什么情况&#xff1f;有谁遇到过吗&#xff1f;大家有没有解决办法&#xff1f; 这个问题可能大家并不陌生&#xff0c;可能也曾遇到过&#xff0c;造成问题出现的原…