程序员认知(一)数据、变量、数据类型、内存、表达式、指针、算法、数据结构、拆箱装箱

目录:

  1. 数据
  2. 变量
  3. 数据类型
  4. 变量、对象与内存
  5. 赋值运算符
  6. 指针
  7. 算法
  8. 数据结构


第一个认知:数据

从《C#入门经典》(第8版)中引用一句话:

计算机程序最基本的描述也许是“一系列处理数据的操作”。

为进一步解释这一点:考虑一下我们的显示单元。我们常常比较熟悉屏幕上的内容,很难不把它设想为“移动的图片”。但实际上,我们看到的仅是一些数据的显示结果,其最初的形式是存储在计算机内存中的0和1数据流。因此我们在屏幕上执行的任何操作,无论是移动鼠标指针、单击图标或在字处理器中输入文本,都会改变内存中的数据

如果说计算机程序是对数据执行操作,则说明我们需要以某种方式存储数据,需要某些方法处理数据。这两种功能是由变量表达式提供的。

 概括为一句话:程序是为处理数据来存在的。

不论我们后面接触多复杂的概念都是为了处理数据。因为数据类型复杂多样,所以以后会接触各种高端名词,但请永远记住,计算机就是用来计算的,计算各种数据。



第二个认知:变量

变量就是用来存储数据的。这个数据包括一切数据。一切意思是说一切类型:整数,小数,负数,实数,虚数,一维,二维,三维,抽象事物,具体事物。代表一切可描述事物。

变量存在的意义:方便我们管理内存空间。

我们在小学初中也有所涉及:x+y=5,x=2,问y=?。x和y都代表了一个数,这个x和y就是变量,可以改变的量,不具体指代2或者3,可以改变,只是用来暂时存储表示。

初中高中以后,开始学习数组,这是一个一维的变量;

大学开始学习矩阵,多维数据变量。

编程以后,变量可以存储一切数据,只要是下文中需要用到的,需要指代的东西,可以描述的东西,都可以用变量来存储。但是学了编程之后,要多理解一点:数据存储在计算机内存中,内存开辟出物理地址来存储数据,变量名是这个物理地址的铭牌、指示牌、标识。变量就是这个区域。

举个栗子:内存可以看做成一个办公大楼,大楼里面有很多房间,这个房间看做内存基本单元。有些公司大一点,占很多房间,有些公司小一些,占一两个房间。同一家公司占用的几个房间看做一个区域,这个区域就是这家公司的地盘。换句话说公司这个数据占用的内存空间。为了便于管理,比如说到访公司、查看水电(读写数据),我们就会对公司所在区域(房间集群)做一个整体的编码记号:记为一个编号company01。这个编号就是变量名。这个变量名指代内存中存储某个数据的区域。具体内存地址,就像大楼的楼层房间号一样。company01:变量名。房间A栋1001到A栋1032:内存地址。这个区域中存的就是公司这个数据。这个公司,也就说这个数据,有很多属性,比如说Size/Width/Channel/Length。。。。

继续引用《C#入门经典》(第8版)中的一段话:

计算机中所有数据事实上都是相同的东西(一组0和1),但变量有不同的内涵,称为类型。



第三个认知:数据类型:

当问到C#的数据类型有哪些时:一般人有点懵:int32、int64、double、string。。。。但是实际上,数据类型应该归为五大类型:

这部分内容引自:刘铁猛《C#语言入门详解》全集(第七集P7)

五大数据类型:类(Classes)、结构体(Structures)、枚举(Enumerations)、接口(Interfaces)、委托(Delegates)

特别注意三点:

1、object和String是引用类型。

2、图片下面那部分蓝色从bool到ushort都是结构体:VS中按F12转到定义,可以直接查看。枚举类型:变量的值是指定的,只能从枚举中选出。不能随意赋值。

3、一切皆对象,对象是任何数据类型的基类。Object。

第四个认知:变量、对象与内存

我们认知事物的过程往往都是由浅及深,由表象到实质。

什么是变量?

  • 表面上来看:变量的用途是存储数据。
  • 实际上,变量表示了存储位置,并且每个变量都一个类型,以决定什么样的值能够存入变量。(类型的意思是说:开辟多少空间。)
  • 变量一共有7种

    • 静态变量、实例变量(成员变量,字段)、数组元素、值参数、引用参数、输出形参、局部变量。
  • 狭义的变量指局部变量,因为其他种类的变量都有自己的约定名称。

    • 简单地讲:局部变量就是方法体(函数体)里声明的变量。
  • 变量的声明

    • 有效的修饰符组合opt类型 变量名 初始化器opt

变量 = 以变量名所对应的内存地址为起点、以其数据类型所要求的存储空间为长度的一块内存区域。 

值类型的变量

  • 以byte/sbyte/short/ushort为例

  • 值类型没有实例,所谓的“实例”与变量合而为一

引用类型的变量与实例

  • 引用类型变量与实例的关系:引用类型变量里存储的数据是对象的内存地址

内存事宜图:

内存中会预留一部分给系统,这部分程序不许占用,否则会报错。甚至系统崩溃。

变量会在栈中记录堆中实例化对象的地址。

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            Student stu;
            stu = new Student();
            Student stu2;
            stu2 = stu;
        }
    }

    class Student
    {
        uint ID;
        ushort Score;
    }
}

实例化对象stu和stu2都指向了同一个实例。这个实例根据定义,一个是4字节,一个是2字节。在堆中位置如上图:内存中堆中实例存在地址30000001中,那么这个30000001转为二进制存在栈中转为二进制如上图所示。

局部变量是在Stack(栈)上分配内存。实例对象在堆上分配内存。比如上例中的stu这个变量,这个局部变量在栈上占据空间。栈中存着对象在堆中的位置。

变量的默认值:在类中定义的字段,如果没有赋值,默认内存中全部刷0,即值为零。

常量值不可改变,用const修饰。const int x =100;  x无法再次赋值。

装箱与拆箱(Boxing & unBoxing) 

装箱:子类赋值给父类。

class Program
{
    static void Main(string[] args)
    {
        int a = 100;
        object obj;
        obj = a;
    }
}

变量a的值100在栈中,如果要赋值给引用变量obj,那么不会让引用变量直接指向栈中100,所在位置,或者说在栈中复制一部分,而是将100这个值,从栈上复制到堆中,然后将堆中的地址返回到栈中存储。从栈上往堆上搬运数据,必定有内存开销, 

拆箱:父类赋值给子类。

static void Main(string[] args)
{
    int a = 100;
    object obj;
    obj = a;
    int b = (int)obj;
}

此时的int b = (int)obj;就是拆箱,将堆中数据拿到。 将值从堆中复制到栈上,肯定会损失性能。

调用方法时的argument列表要与定义方法是的Parameter列表相匹配。

C#是强类型语言,argument是值、parameter是变量,值与变量一定要匹配,不然编译器会报错。

定义的时候是parameter,形参。调用的时候是argument,是值。

第五个认知:赋值运算符

引用来源:《C primer Plus(第六版)中文版》5.2.1节。

在C语言中,=并不意味着“相等”,而是一个赋值运算符。下面的赋值表达式语句:

bmw = 2002;

把值2002赋给变量bmw。

也就是说,=号左侧是一个变量名,右侧是赋给该变量的值。符号=被称为赋值运算符。

另外,上面的语句不读作“bmw等于2002”,而读作“把值2002赋给变量bmw”。赋值行为从右往左进行

觉得简单吗?看下面这条常用语句:

i = i + 1; 

对数学而言,这完全行不通。如果给一个有限的数加上 1,它不可能“等于”原来的数。但是,在计算机赋值表达式语句中,这很合理。该语句的意思是:找出变量 i 的值,把该值加 1,然后把新值赋值变量i(见下图)。

类似这样的语句没有意义(实际上是无效的):

2022 = bmw;

因为在这种情况下,2002 被称为右值(rvale),只能是字面常量。不能给常量赋值,常量本身就是它的值。因此,在编写代码时要记住,=号左侧的项必须是一个变量名。因此,在编写代码时要记住,=号左侧的项必须是一个变量名。

实际上,赋值运算符左侧必须引用一个存储位置

  • 最简单的方法就是使用变量名。
  • 此外,“指针”,可用于指向一个存储位置。

赋值操作:左侧必须是可修改的左值。

 赋值表达式语句的目的是把值储存到内存位置上。

用于储存值的数据存储区域统称为数据对象(data object)。

C 标准只有在提到这个概念时才会用到对象这个术语。

  • 使用变量名是标识对象的一种方法
  • 可以指定数组的元素、
  • 结构的成员,
  • 或者使用指针表达式(指针中储存的是它所指向对象的地址)

左值(lvalue)是 C 语言的术语,用于标识特定数据对象的名称或表达式。

因此,对象指的是实际的数据存储,而左值是用于标识或定位存储位置标签

例外:

const int Two = 2;

此处的=运算符表示初始化而不是赋值。




第六个认知:指针

指针?什么是指针?从根本上看,指针(pointer)是一个值为内存地址的变量(或数据对象)。正如char类型变量的值是字符,int类型变量的值是整数,指针变量的值是地址。

————《C primer Plus(第六版)中文版》9.7节

指针提供一种以符号形式使用地址的方法。因为计算机的硬件指令非常依赖地址,指针在某种程度上把程序员想要传达的指令以更接近机器的方式表达。因此,使用指针的程序更有效率。尤其是,指针能有效地处理数组。数组表示法其实是在变相地使用指针。

————《C primer Plus(第六版)中文版》10.3节

第七个认知:算法

第八个认知:数据结构

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值