美文网首页
C/C++中数据类型和变量的本质

C/C++中数据类型和变量的本质

作者: 潘雪雯 | 来源:发表于2020-06-23 14:50 被阅读0次

数据类型的本质:固定大小内存块的别名

  • 数组b中b和&b所代表的数据类型不一样
int main(){
    int a ;//告诉c编译器分配4个字节的内存
    int b[10];//告诉c编译器分类40个字节的内存
    
    printf("b:%d,b+1:%d,&b:%d,&b+1:%d\n",b,b+1,&b,&b+1);
     
} 
image.png
发现b和b+1刚好相差4个字节,但是&b和&b+1相差甚远
b代表的数组首元素的地址
&b代表整个数组的地址
发现b和&b都是数组数据类型,那么,数组数据类型的三个重要指标
数组类型
数组指针
数组类型和数组指针类型的关系
  • 数据类型的大小
printf("sizeof(b):%d\n",sizeof(b));
printf("sizeof(a):%d\n",sizeof(a)); 
image.png
  • 数据类型别名
    用关键字typedef对数据类型进行重命名
typedef struct Teacher2
{
    char name[64];
    int age;
}Teacher2;

typedef int u32;

如下图不用typedef就会在数据的使用过程中出错


image.png

变量:既能读又能写的内存对象

变量一旦初始化后不能修改即为常量
变量的本质是内存空间的别名,

  • 修改变量的方式:
    直接:a = 20
    间接:直接通过内存,就是通过指针 p = &a ,*p = 20 ((int)地址)=20
  • 变量的生命周期


    内存四区

    操作流程:
    1,操作系统把物理硬盘代码load到内存
    2,操作系统把c代码分为四个区
    3,操作系统找到main函数入口执行

  • 各区元素分析
    栈区:由编译器自动分配释放,存放函数的参数值、局部变量的值等
    堆区:一般由程序员分配释放(动态内存申请与释放)。若程序员不释放,程序结束时可能由操作系统回收
    全局区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,该区域在程序结束后由操作系统释放字符串常量和其他常量的存储位置也在全局区,在程序结束后由操作系统释放。
    程序代码区:存放函数体的二进制代码
  • 静态存储区的理解
//#define  _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>

char * getStr1(){
    char *p1 = "abcdefg";
    return p1;
}

char *getStr2()
{
    char *p2 = "abcdefg2";
    return p2;
}

int main()
{
    char *p1 = NULL;
    char *p2 = NULL;
    p1 = getStr1();
    p2 = getStr2();
    //打印p1和p2内存空间的数据 
    printf("p1:%s,p2:%s \n",p1,p2);
    //打印p1和p2的值 
    printf("p1:%d,p2:%d \n",p1,p2);
    printf("hello...\n");
    //system("pause");
    
    //return 0;
 } 

打印结果如下所示:


image.png

因为p1和p2对应不同的字符串和存储单元,故此时打印出的p1和p2都是不一样。但如果把p1 = "abcdefg2",那么p1和p2指向的值会是一样的嘛?

image.png
此时会发现p1和p2的值是一样的。为什么呢?
从内存角度理解:程序从main()开始执行,先执行
p1和*p2的初始化。
char *p1 = NULL; char *p2 = NULL;这个过程发生在栈区中,在栈区中分配四个字节给p1,分配四个字节给p2。
char *p1 = "abcdefg2";char *p2 = "abcdefg2";这个过程发生在全局区,因为进入子函数getStr1()和getStr2()中,发现子函数中给p1和p2赋值一个字符串常量,该字符串常量应该放在全局区,所以在使用完子函数getStr1()和getStr2()之后字符串常量不会被直接析构掉,故在主函数中还是可以用的即p1和p2所指向内存空间的值在主函数中是已知的。
ps:此时子函数中又出现p1和p2,和主函数中的p1和p2是不一样的。也放在栈区中,
假设字符串首地址为0xaa11,那么p1的值为0xaa11,返回到主函数中p1的值为0xaa11,对应内存空间的数据为abcdefg。具体示意图如下所示:
内存四区图
  • 栈的生长方向和buf的生长方向不是同一个概念,buf的生长方向永远向上,而栈的生长方向因编译器的不同而不同,具体自测。

相关文章

  • C++ 变量和复合类型

    前面说了C++的基本数据类型,下面来看看在C++中如何定义变量和常量。 变量 定义和初始化 C++定义变量的方式和...

  • C++ 中的变量

    C++ 中的变量内存数据类型 C++ 数据类型 使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的...

  • C/C++基础(5)

    C++ namespace 引用 引用的本质是变量的别名int a = 10;int &b = a;"数据类型 &...

  • C/C++中数据类型和变量的本质

    数据类型的本质:固定大小内存块的别名 数组b中b和&b所代表的数据类型不一样 发现b和b+1刚好相差4个字节,但是...

  • C++变量的存储类别

    参考:C++(存储类)经典!! C++存储类(菜鸟教程) C++变量属性 一个变量除了数据类型以外,还有3种属性:...

  • #C++ Primer Plus# 第三章 处理数据

    面向对象编程(OOP)的本质:设计并扩展自己的数据类型 内置C++数据类型C++数据类型 标识存储的数据的方法:使...

  • SystemC入门笔记

    首发地址个人博客 变量说明 数据类型 SystemC为C++的一个库,因此C++的特性在SystemC中均可以使用...

  • C++和Python的混合编程-C++数据类型的导出和调用

    视频教程:C++数据类型的导出和调用(上)C++数据类型的导出和调用(下)C++数据类型的导出的补充 boost:...

  • C++学习笔记

    初识C++ C++标准格式 变量 作用:给一段指定的内存空间起名,方便操作这段内存。语法:数据类型 变量名 = ...

  • C++中的成员变量和成员函数

    C++中的类有两个成分: (1)成员变量 成员变量按照作用域分为静态成员变量和非静态成员变量,C++中成员变量的默...

网友评论

      本文标题:C/C++中数据类型和变量的本质

      本文链接:https://www.haomeiwen.com/subject/tgkwthtx.html