zoukankan      html  css  js  c++  java
  • C/C++小课之数组名是什么

    我们今天讨论数组名是什么东西,理解它有助于我们进一步理解和使用指针。

    因为它涉及到了内存地址。

    问题

    数组名是什么?含义是什么?

    思路

    前提

    一个值+1之后的变化可以反映出它的意义/含义。

    前提的证明

    其实不证自明,计算机中就是这样的。

    • 生活中

      一个苹果+1,结果是两个,增加了一个苹果。

      一箱苹果+1,结果是两箱,个数是2*每箱苹果数,增加了一箱苹果。

    • 计算机中

      int型变量的地址+1,增加了一个int的大小。

      double型变量的地址+1,增加了一个double的大小。

    思路

    根据前提,通过将数组名或数组名相关的值+1来判断它的含义。

    验证

    编程中要了解一个东西,大多时候我们可以通过输出它来了解它。

    代码

    #include <iostream>
    using namespace std;
    
    int main()
    {
        //注释指出array代表什么
    	int array[5] = { 1,2,3,4,5 };
    	printf("    &array[0] =  %p
    ", &array[0]);		//首元素
    	printf("        array =  %p
    ", array);			//数组
    	printf("      array+1 =  %p
    ", array + 1);		//数组
    	printf("  &array[0]+1 =  %p
    ", &array[0] + 1);	//首元素
    	printf("       &array =  %p
    ", &array);	    //数组
    	printf("     &array+1 =  %p
    ", &array + 1);	//数组
    	printf("sizeof(array) =  %zd
    ", sizeof(array));//数组
    }
    

    为什么用printf不是cout?用cout其实也行,printf可能更方便,而且我忘了cout怎么控制位数了。

    结果

        &array[0] =  0000002A433FF628
            array =  0000002A433FF628
          array+1 =  0000002A433FF62C
      &array[0]+1 =  0000002A433FF62C
           &array =  0000002A433FF628
         &array+1 =  0000002A433FF63C
    sizeof(array) =  20
    

    结论

    数组名是什么,有什么含义

    数组名是一个常量(所以不能被赋值),是一个地址。&array中array并不是地址,因为地址是一个值,我们并不能取一个值的地址吧)

    在不同情况下,有着不同的含义。

    • 代表整个数组

      碰到&sizeof时,数组名代表整个数组,作用像是一个变量。

    • 代表数组首元素

      数组名单独出现或碰到[]*时,数组名代表数组第一个元素,是一个地址。(这个下次会讲)

    知识点

    IDE、编译器、编辑器

    • 编辑器

      文本编辑器,比如notepad++,sublime。

    • 编译器

      处理我们写的代码。

      C/C++的比如有:gcc,mingw。

      计算机语言可以分为两种:编译语言和解释语言。

    • IDE

      Integrated Development Environment,集成开发环境。

      集合了编辑器和编译器的功能,还有一些辅助开发的功能。

    Visual Studio

    • 解决方案

    • 项目

    • 调试

    • 查看源码

      比如看sizeofiostreamCtrl+左键

    • 查看类图

      右击(项目)-查看-查看类图

    十六进制

    https://tool.lu/hexconvert/

    地址+1

    核心在于单位。见下篇

    sizeof

    占用的字节数。基本数据类型、结构体(会字节对齐)。

    • 不同环境下(32位、64位等)某种类型的变量占用字节数可能是不同的

      比如指针,32位下是4个字节,64位下是8个字节,

      正好是对应计算机的字长。(后边有讲计算机字长是什么)

    • %zdsize_t

    后边还有一篇

    %p %x

    两者有细微差别。

    重视warning

    VS的warning还是比较全的,其他IDE的waring不一定全。

    如果写代码出了问题却找不到原因,有可能是warning给出的潜在问题没有处理。

    写代码时遇到waring一定要处理,不然很容易出问题。

    混合编程

    C和C++还是不一样的。特别是函数的使用,如果要动态申请一个类对象的内存,可别用malloc,它和new还是不一样的。

    一些重要名词

    生活、编程中出现的数字、字符串、字符等等,都是值。

    比如1,2,3我爱你等等。

    变量

    变量算是对值的一个替代(或者说抽象)吧,提高复用性。

    地址

    地址是个值。

    计算机有存储空间。我们将其一个个地编号,也就是给了它一个地址。

    指针

    指针是个变量。

    跟普通变量其实没什么本质区别,只不过它被用来存储地址而已。

    运算符优先级

    * [] &的优先级?

    计算机字长

    字长:字的长度(位数)。

    计算机中有字节这个单位。1个字节等于8位。

    多个字节组成

    我们平常说的电脑32位,64位指的就是字长。


    作者:@臭咸鱼

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/chouxianyu/

    欢迎讨论和交流!

  • 相关阅读:
    第三届蓝桥杯C++B组国(决)赛真题
    第二届蓝桥杯C++B组国(决)赛真题
    第二届蓝桥杯C++B组国(决)赛真题
    第二届蓝桥杯C++B组国(决)赛真题
    第二届蓝桥杯C++B组国(决)赛真题
    第二届蓝桥杯C++B组国(决)赛真题
    Java实现矩阵相乘问题
    Java实现矩阵相乘问题
    Java实现矩阵相乘问题
    Java实现矩阵相乘问题
  • 原文地址:https://www.cnblogs.com/chouxianyu/p/11322951.html
Copyright © 2011-2022 走看看