网站建设读后感,音乐网站设计外国,郑佩佩 最新消息,公司网页制作培训试题一、数组的内存布局 先看下面的例子#xff1a;int a[5];所有人都明白这里定义了一个数组#xff0c;其包含了5 个int 型的数据。我们可以用a[0],a[1]等来访问数组里面的每一个元素#xff0c;那么这些元素的名字就是a[0],a[1]…吗#xff1f;看下面的示意图#xff1a; 如…一、数组的内存布局 先看下面的例子int a[5];所有人都明白这里定义了一个数组其包含了5 个int 型的数据。我们可以用a[0],a[1]等来访问数组里面的每一个元素那么这些元素的名字就是a[0],a[1]…吗看下面的示意图 如上图所示当我们定义一个数组a 时编译器根据指定的元素个数和元素的类型分配确定大小元素类型大小*元素个数的一块内存并把这块内存的名字命名为a。名字a 一旦与这块内存匹配就不能被改变。a[0],a[1]等为a 的元素但并非元素的名字。数组的每一个元素都是没有名字的。那现在再来回答第一章讲解sizeof 关键字时的几个问题sizeof(a)的值为sizeof(int)*532 位系统下为20。sizeof(a[0])的值为sizeof(int)32 位系统下为4。sizeof(a[5])的值在32 位系统下为4。并没有出错为什么呢我们讲过sizeof 是关键字不是函数。函数求值是在运行的时候而关键字sizeof 求值是在编译的时候。虽然并不存在a[5]这个元素但是这里也并没有去真正访问a[5],而是仅仅根据数组元素的类型来确定其值。所以这里使用a[5]并不会出错。sizeof(a[0])的值在32 位系下为4这很好理解。取元素a[0]的首地址。sizeof(a)的值在32 位系统下也为4这也很好理解。取数组a 的首地址。但是在VisualC6.0 上这个值为20我认为是错误的。二、省政府和市政的区别----a[0]和a 的区别 这里a[0]和a 到底有什么区别呢a[0]是一个元素a 是整个数组虽然a[0]和a的值一样但其意义不一样。前者是数组首元素的首地址而后者是数组的首地址。举个例子湖南的省政府在长沙而长沙的市政府也在长沙。两个政府都在长沙但其代表的意义完全不同。这里也是同一个意思。三、数组名a 作为左值和右值的区别 简单而言出现在赋值符“”右边的就是右值出现在赋值符“”左边的就是左值。比如,xy。左值在这个上下文环境中编译器认为x 的含义是x 所代表的地址。这个地址只有编译器知道在编译的时候确定编译器在一个特定的区域保存这个地址我们完全不必考虑这个地址保存在哪里。右值在这个上下文环境中编译器认为y 的含义是y 所代表的地址里面的内容。这个内容是什么只有到运行时才知道。C 语言引入一个术语-----“可修改的左值”。意思就是出现在赋值符左边的符号所代表的地址上的内容一定是可以被修改的。换句话说就是我们只能给非只读变量赋值。既然已经明白左值和右值的区别下面就讨论一下数组作为左值和右值的情况当a 作为右值的时候代表的是什么意思呢很多书认为是数组的首地址其实这是非常错误的。a 作为右值时其意义与a[0]是一样代表的是数组首元素的首地址而不是数组的首地址。这是两码事。但是注意这仅仅是代表并没有一个地方这只是简单的这么认为其具体实现细节不作过多讨论来存储这个地址也就是说编译器并没有为数组a分配一块内存来存其地址这一点就与指针有很大的差别。a 作为右值我们清楚了其含义那作为左值呢a 不能作为左值这个错误几乎每一个学生都犯过。编译器会认为数组名作为左值代表的意思是a 的首元素的首地址但是这个地址开始的一块内存是一个总体我们只能访问数组的某个元素而无法把数组当一个总体进行访问。所以我们可以把a[i]当左值而无法把a当左值。其实我们完全可以把a 当一个普通的变量来看只不过这个变量内部分为很多小块我们只能通过分别访问这些小块来达到访问整个变量a 的目的。