数组的关系运算

观察一个循环,它用来清除一个数组中所有的元素。

#define N_VALUES 5
float values[N_VALUES];
float *vp;
for(vp=&values[0];vp<&values[N_VALUES];)
            *vp++=0;

for语句使用了一个关系测试来决定是否结束循环,这个测试是合法的,因为vp和指针常量都指向同一数据中的元素(事实上,这个指针常量所指向的是数组最后一个元素后面 的那个内存位置)使用!=i代替<也是可行的

现在考虑下面这个循环:

for(vp=&values[N_VALUES];vp>&values[0];)
           *--vp=0;

它和前面那个循环所执行的任务g相同,但数组元素将以相反的次序清除。

注意:有人可能会反对像*--vp这种写法,认为可读性差,,写下了下面的写法:

for(vp=&values[N_VALUES-1];vp>=values[0];)
           *vp=0;

警告:在数组第一个元素被清除之后,vp的值还将减去1,而接下去的一次比较运算是用于结束循环的。

但是比较表达式vp>=&values[0]的值是未定义的,因为vp移到了数组的边界之外。标准允许指向数组元素的指针与指向数组最后一个n元素后面的那个内存位置的指针进行比较,但不允许与指向数组第一个元素之前的那个内存位置的指针进行比较。

时间: 2024-10-18 05:52:15

数组的关系运算的相关文章

c/c++ 函数、常量、指针和数组的关系梳理

压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习……无限循环中,好记性不如烂笔头……从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和类型,c 中的数组参数是引用形式传参(传址调用),而常量标量是按值传递. //[]方括号表示声明的是数组,里面的数字表明了数组包含的元素数目 int states[50];//声明50个整数的数组 double code[365];//声明365个浮点数的数组 char chr[20];//声明20

C指针和数组的关系详解

1.C中数组和指针的关系 对于任意类型的数组arr,对于同类型的指针类型parr(确切一点,可以假设类型为int,即int arr[], *parr).它们之间有如下"内幕": 1.数组的名称arr本身就是一个指针,这个指针指向数组的第一个元素 2.因为名称arr本身是指针,所以可以直接赋值给同类型的指针parr:parr = arr,这使得parr也指向数组的第一个元素,所以这个赋值过程等价于parr = &arr[0] 3.指针和数组名在效果上是等价的.它们的区别在于:指针

C++ 出现bug :二位数组的操作运算,求非对角线的元素的和

编写一个通用程序,求出二位数组(行数和列数必须相等)的非对角线的元素之和,试建立类MATRIX完成上述功能 #include<iostream> using namespace std; class MATRIX { public: void mATRIX(); void MATRIX_sum(); void MATRIX_display(); static int fact_len;//定义静态变量 private: int sum; int a[40][40]; }; int MATRIX

关系运算 - 数据库系统原理

关系模型有三个重要组成部分: 数据结构.数据库中全部数据及其相互联系都被组织成"关系"(二维表格)的形式. 数据操纵.关系模型提供一组完备的高级关系运算,以支持对数据库的各种操作.关系运算又分为:关系代数和关系演算两类. 数据完整性规则.数据库中数据必须满足实体完整性.参照完整性.用户定义完整性等三类完整性规则. 关系代数的五个基本操作 关系代数是以关系(属性个数相同的元组的集合)为运算对象的一组高级运算的集合.关系代数的操作可以分为两类: 传统的集合操作:并.差.交.笛卡尔积(乘法)

关系运算

判断两个浮点数是否相等,两值差的绝对值,再和一个比较小的数作关系运算.

黑马程序员----算术运算、关系运算、逻辑运算

一.算数运算 1.C语言中一共提供了34种运算符 2.基本运算(加.减.乘.除) 3.取余运算(也称模运算) %两边都是整数,如果为小数会报错 取余结果的正负性取决于%左边的整数 取余运算可以将一个整数的值固定在多少以内 4.自动类型装换 int a = 10.8; // double 自动转换成int,会有警告: 5.强制类型装换 int a = (int)10.8; // double 自动转换成int,不会再有警告: 6.自动类型提升 double c = 10.6 + 6; // 会将6

java整型数与网络字节序的 byte[] 数组转换关系

java整型数与网络字节序的 byte[] 数组转换关系 工作项目需要在java和c/c++之间进行socket通信,socket通信是以字节流或者字节包进行的,socket发送方须将数据转换为字节流或者字节包,而接收方则将字节流和字节包再转换回相应的数据类型.如果发送方和接收方都是同种语言,则一般只涉及到字节序的调整.而对于java和c/c++的通信,则情况就要复杂一些,主要是因为java中没有unsigned类型,并且java和c在某些数据类型上的长度不一致. 本文就是针对这种情况,整理了j

指针与数组的关系

指针与数组间关系紧密却一直没弄明晰,今天就来整理一下. ①定义中的内涵 当我们在定义数组时,必须要同时指定其类型和大小:而对于指针,则只需要指定其类型. 之所以数组需要指定大小,是因为系统会根据你所指定的大小为数组分配空间,例如int a[5],则数组得到sizeof(int)*5大小的存储空间(而且是连续的空间),不多不少. 而对于指针,系统只会为其分配空间,其指向地址并未分配,例如char *a,系统会为变量a分配空间,但*a(即a指向的地方)是随机的,系统不会为*a分配空间.这时候,你可以

hive关系运算详解

关系运算:1. 等值比较: = 语法:A=B 操作类型:所有基本类型 描述: 如果表达式A与表达式B相等,则为TRUE:否则为FALSE 举例: hive>select 1 from lxw_dual where 1=1; 2. 不等值比较: <> 语法: A <> B 操作类型: 所有基本类型 描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL:如果表达式A与表达式B不相等,则为TRUE:否则为FALSE 举例: hive> select1 from