C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)

这篇具有很好参考价值的文章主要介绍了C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


参考: 麦子学院-嵌入式C语言高级-内存空间

2-3 : C语言内存空间的使用

指针概述

内存类型资源地址、门牌号的代名词
指针:地址的代名词
指针变量:存放指针这个概念的盒子
*P
char *p
*p;
C语言娟译器对指针这个特殊的概念,有2个疑问?
1、分配一个盒子,盒子要多大?
在32bit系统中,指针就4个字节
2、盘子里存放的地址所指向内存的读取方法是什么?
3、指针指向内容空间,一定要保证合法性。

示例:

#include <stdio.h>

int main()
{
    int *p1;
    char *p2;

    printf("the p1 is %u,p2 is %u\n",sizeof(p1),sizeof(p2));

    return 0;

}

返回值(64位系统):
```bash
E:\temp>cd "e:\temp\" && gcc 2.c -o 2 && "e:\temp\"2
the p1 is 8,p2 is 8

C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)

读内存空间(int):

#include <stdio.h>

int main()
{
    int a = 0x12345678;
    int *p1;

    p1 = &a;

    printf("the p1 is %x\n",*p1);

    return 0;

}
// 返回值
// E:\temp>cd "e:\temp\" && gcc 2.c -o 2 && "e:\temp\"2
// the p1 is 12345678

读内存空间(char):

#include <stdio.h>

int main()
{
    int a = 0x12345678;
    char *p1;

    p1 = &a;

    printf("the p1 is %x\n",*p1);

    return 0;

}
// E:\temp>cd "e:\temp\" && gcc 2.c -o 2 && "e:\temp\"2
// 2.c: In function 'main':
// 2.c:8:8: warning: assignment from incompatible pointer type [enabled by default]
// the p1 is 78

浮点数的存储(形式非常特殊)
显示方法1:

#include <stdio.h>

int main()
{
    float a = 1.2;
    int *p;

    p = &a;

    printf("the p1 is %x\n",*p);

    return 0;

}
// E:\temp>cd "e:\temp\" && gcc 2.c -o 2 && "e:\temp\"2
// 2.c: In function 'main':
// 2.c:8:7: warning: assignment from incompatible pointer type [enabled by default]
// the p1 is 3f99999a

显示方法2:

#include <stdio.h>

int main()
{
    float a = 1.2;

    unsigned char *p;

    p = &a;

    printf("the p1 is %x\n",*p);

    return 0;

}
// E:\temp>cd "e:\temp\" && gcc 2.c -o 2 && "e:\temp\"2
// 2.c: In function 'main':
// 2.c:9:7: warning: assignment from incompatible pointer type [enabled by default]
// the p1 is 9a

注意:如果用char *p,会打印符号位,导致显示为:the p1 is ffffff9a。

指针+修饰符

const
常量,只读【不能变】。
C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)

内存用性:
1、内存操作的大小
2、内存的变化性,可写可读

const char *p 【推荐】 字符串常量 p是门牌号
char const *p 同上,

char *const p【推荐】 硬件资源 LCD 指向固定地址,内容可以刷新
char *p const 同上,

const char *const p ROM

示例:

#include <stdio.h>

int main()
{
    char *p = "hello world!\n";
    char buf[] = {"hello world!\n"};
    char *p2 = buf;

    printf("the one  is %x\n",*p);

    *p2 = 'a'; //不合法,会出现段错误

    printf("%s\n",p2); //无输出


    return 0;

}

正确的写法应该是:
const char p = “hello world!\n”;
此时
p2 = 'a’编译器提示错误:

E:\temp>cd "e:\temp\" && gcc 2.c -o 2 && "e:\temp\"2
2.c: In function 'main':
2.c:11:5: error: assignment of read-only location '*p'

volatile
防止编译器优化指向内存地址,每次都要强制更新或者执行地址所指的值
volatile char *p
*p== 0x10
while(p == 0x10 );
xxx
typedef
char *p;
什么类型,变量名称;
char *name_t; name_t是一个指针(存储地址的盒子),指向了一个char类型的内存
typedef char *name_t; name_t是一个指针类型的名称(别名),指向了一个char类型的内存

name_t abc;

指针+运算符

++,–,+,-

int *p = xxx [0x12]

p+1 [012+1(sizeof(*p))] +1是指向下一个单位,操作的是单位。
指针的加法运算,实际上加的是一个单位,单位的大小可以使用sizeof(p[0])

int *p p+1
char *p p+1

p++ p-- 更新地址
[]
变量名[n] p+n等到地址, p[n]自动将该地址的内容取出来
n ID 标签
地址内容的标签访问方式,取出标签里的值。

示例

#include <stdio.h>

int main()
{
    int a = 0x12345678;
    int b = 0x99991199;

    int *p1 = &b; //指针与地址类型一致

    char *p2 = (char *) &b; //如果不强制转换,编译器会报警告,变量类型与指针不一样

    printf("the p1+1 is %x ,or is %x, *p1+1 is %x\n",*(p1+1),p1[1],*p1+1);

    printf("the p2+1 is %x \n",p2[1]);

    return 0;

}
// E:\temp>cd "e:\temp\" && gcc 2.c -o 2 && "e:\temp\"2
// the p1+1 is 64fe14 ,or is 64fe14, *p1+1 is 9999119a
// the p2+1 is 11

与教程有差异,没有得到预想的结果,见图:

另外对于const的缺陷,编译器也做了优化,不再能够修改,如一下代码:

#include <stdio.h>

int main()
{
    const int a = 0x12345678; //编译器告知结果
    int b = 0x11223344;

    //a = 100; //2.c:8:5: error: assignment of read-only variable 'a'
    int *p = &b;
    //*(p+1);

    p[1] = 0x100;

    printf("the a is %x\n",a);

    return 0;

}
// p[1] = 0x100未能实现
// E:\temp>cd "e:\temp\" && gcc 2.c -o 2 && "e:\temp\"2
// the a is 12345678

C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)
C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)

const的详细解释:可参考C语言中的const
P+1与*(P+1)的延伸可参考:关于C语言中二维数组的P+1与*(P+1)个人浅见

逻辑操作符>= <= == !=

1、跟一个特殊值进行比较,0x0,地址的无效值,结束标志。
if (p==0x0);
建议用NULL进行比较。
2、指针必须是同类型的比较才有意义
char *
int *

示例1

#include <stdio.h>

int main()
{
    int a = 0x12345678; //编译器告知结果
    int b = 0x99991199;

    int *p1 = &b;

    char *p2 = (char *)&b;

    if(p1 >= p2){
            printf("===========\n");
    }

    // printf("the a is %x\n",a);

    return 0;

}
// E:\temp>cd "e:\temp\" && gcc 2.c -o 2 && "e:\temp\"2
// 2.c: In function 'main':
// 2.c:12:11: warning: comparison of distinct pointer types lacks a cast [enabled by default]

多级指针

int **p;
存放地址的地址空间,
如:char **p 描述内存与内存之间的线性关系,

p[0] p[1] p[n]
C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)

p[m]==NULL —>二维空间结束了(结束标志)

例子

#include <stdio.h>

int main(int argc,char **argv)
{
    int i;

    for(i = 0;i < argc;i++){
            printf("the argv[%d] is %s\n",i,argv[i]);

    }

    return 0;

}
// gcc 2.c -o 2
// E:\temp>2 123 456
// the argv[0] is 2
// the argv[1] is 123
// the argv[2] is 456

省略argc(个数)的常用写法:

C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)文章来源地址https://www.toymoban.com/news/detail-421567.html

#include <stdio.h>

int main(int argc,char **argv)
{
    int i = 0;

    while(argv[i] != NULL){
            printf("the argv is %s\n",argv[i]);
            i++;
    }
    return 0;

}
// E:\temp>2 123 456
// the argv is 2
// the argv is 123
// the argv is 456

到了这里,关于C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式物联网单片机项目开发实例-4G DTU边缘数据采集网关开发

    链接:https://pan.baidu.com/s/163D-kElFqXov629YaSrWDw?pwd=1688 提取码:1688 [1.EC200S_STM32F103_4G CAT1网络TCP和UDP的透传字符串] [2.EC200S_STM32F103_4G CAT1网络TCP和UDP的透传十六进制包含0x00] [3.EC200S_STM32F103_4G CAT1通过外置MQTT协议发送定位和固定数据到ONENET] [4.EC200S_STM32F103_4G CAT1通过外置MQTT协议发送

    2024年01月16日
    浏览(37)
  • 嵌入式linux物联网毕业设计项目智能语音识别基于stm32mp157开发板

    stm32mp157开发板FS-MP1A是华清远见自主研发的一款高品质、高性价比的Linux+单片机二合一的嵌入式教学级开发板。开发板搭载ST的STM32MP157高性能微处理器,集成2个Cortex-A7核和1个Cortex-M4 核,A7核上可以跑Linux操作系统,M4核上可以跑FreeRTOS、RT-Thread等实时操作系统。开发板搭配仿真

    2024年02月02日
    浏览(54)
  • 嵌入式Linux实战开发之项目总体概述(基于IMX6ULL)

    现在越来越多的智能设备融入到我们的生活,然而,丰富的设备之下也是有一套基本的运行框架,只是根据不同的需求增减相应的功能从而满足自身的需要。而电子产品量产工具项目,就是实现基础的功能,可以作为一个基础的模版,学成之后便可进行扩展,根据自身需求,

    2024年02月13日
    浏览(42)
  • 【嵌入式实战项目精选】附源码 | 三等奖作品 | 基于RA4M2和阿里云物联网平台的智能卧室小管家

    【RA4M2设计挑战赛】基于RA4M2和阿里云物联网平台的智能卧室小管家 摘要 本项目已RA4M2为主控,搭载了RT-Thread实时操作系统,配合Wi-Fi模块来提供网络通讯能力,外设接入了继电器、红外发射、OLED显示等器件,成功连上了阿里云物联网平台,实现了一个智能卧室小管家的产品

    2024年02月06日
    浏览(31)
  • 嵌入式项目分享 stm32智能运动计步系统 - 物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(49)
  • 嵌入式项目分享 stm32机器视觉的口罩佩戴检测系统 - 单片机 物联网 嵌入式

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(58)
  • 启动电容与运行电容-电容-嵌入式开发-物联网开发

            启动电容与运行电容常常在单相异步电动机相关电路中十分常见,可以通过电容上标注的字母来区分,启动电容以CD开头,而运行电容以CBB开头。         启动电容以CD标识开头,一般来说其 耐压值小,容量大 。         启动电容一般与离心开关串联,电机启动以

    2024年02月13日
    浏览(36)
  • 嵌入式项目分享 单片机家用燃气的可视化实时监控报警仪 - 物联网 嵌入式 stm32

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月22日
    浏览(39)
  • 物联网项目分享 stm32实现车牌识别系统 -物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月21日
    浏览(51)
  • 嵌入式项目分享 Stm32 WIFI智能家居温湿度和烟雾检测系统 - 单片机 物联网 嵌入式

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年01月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包