第6章(C语言基础)_第1页
第6章(C语言基础)_第2页
第6章(C语言基础)_第3页
第6章(C语言基础)_第4页
第6章(C语言基础)_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章指针 6 1指针的基本概念 1 内存与变量地址内存地址 计算机存储器的存储单元是以字节为单位进行线性编址 每一个存储单元为一个字节 对应有一个地址 相当于房间号 存储器的地址从0开始编号 顺序地每隔一个单元地址加1 这些单元编号称为内存单元的地址 C语言一个程序的指令及数据都存放在存储器内 即在地址所标志的单元存放 数据所占用存储空间取决于机器种类和数据类型 请注意 区别一个内存单元的地址和内存单元的内容是两个不同的概念 变量地址 在C中定义的变量 编译时系统根据该变量的类型分配相应的内存单元 当一个变量只占用一个内存单元时 内存单元的地址就是变量的地址 当变量占用连续的若干个内存单元时 最前面一个单元的地址就是该变量的地址 例如 有一条定义语句 inti 3 j 5 floatf 给它分配的内存单元如图1所示 而记录下来的变量与地址对照表如图2所示 2 变量的三要素 名字 类型与值每个变量都通过变量名与相应的存储单元相连系 具体分配哪些单元给变量 由 编译系统完成变量名到对应内存单元地址的变换 当程序执行时 对变量的存取操作是通过该变量对应的内存地址来实现的 内存中没有变量名 变量名是高级语言的产物 变量分配存储空间的大小由类型决定 变量的值则是指相应存储单元的内容 3 内存存取方式直接存取 通过变量名查取变量的地址 再从变量对应地址的内存单元中取得值或将某值存入变量对应地址的内存单元中称为直接存取方式 即按变量地址存取变量的值 间接存取 通过定义一种特殊的变量专门存放内存或变量的地址 然后根据该地址值再去访问相应的存储单元 具体思路是 将一个变量的地址存放在另一个特殊变量中 这样就建立了这个变量与另一个特殊变量的联系 如定义一个特殊变量p 它用来存放变量a的地址 可通过语句p 将a的地址存放在变量p中 此时p的值为4000 即变量a所在占用单元的起始地址 要存取变量a的值 可先找到存放a的地址单元 4800 从中取出a的地址 4000 然后到4000字节开始的单元取a值 这种间接的通过变量p得到变量a的地址 再存取变量a的值的方式即为 间接存取 一个变量的地址称为该变量的指针 如4000就是指向变量a的指针 指针变量 用于存放其他变量地址的变量被称为指针变量 如p即是一个指针变量 它存放的是a的地址4000 从间接存取方式可知 变量p和变量a之间存在一种联系 通常称变量p指向变量a 变量a是变量p所指向的对象 在 语言中 用指针来表示一个变量指向另一个变量这样的指向关系 指针 和 指针变量 是两个不同的概念 指针变量本身也是一种变量 它用来存放指针值 即存放对象变量的地址 而指针是地址 它是一个常量 指针变量的值是指针 例如 变量a的地址是4000 可以说变量a的指针是4000 而不能说变量a的指针变量是4000 而应说指针变量p的值是4000 6 2指针变量的类型声明指针变量的定义类型标识符 指针变量名 例 float p1 定义p1为指向实型变量的指针变量 char p2 定义p2为指向字符型变量的指针变量 在指针变量定义中 是一个说明符 它表明其后的变量是指针变量 如p是指针变量 而不要认为 p 是指针变量 指针变量定义时指定的数据类型不是指针变量本身 变量存放的值 的数据类型 而是指针变量所指向的对象 或称目标 的数据类型指针变量存放的是所指向的某个变量的地址值 而普通变量保存的是该变量本身的值指针变量并不固定指向一个变量 可指向同类型的不同变量 1 指针运算符与地址运算符与指针引用有关的两个运算符 与 6 3指针变量的引用 指针运算符 指向运算符 间接访问运算符 功能是将指针变量所指向变量的内容取出 其一般格式为 指针变量 取地址运算符 运算符 可用来实现给出运算对象的地址 其一般格式为 注意 取地址运算符 只能作用于变量或数组元素 而不能作用于表达式 常量 寄存器 注意 此处 是访问指针所指对象的运算符 与指针定义时的 不同 其作用是代表指针变量所指向的对象变量的值 取内容运算是使用指针的基本手段 它与取地址运算互为逆运算 即 与 的作用相反 作用返回操作数的地址 作用返回这个地址中变量的值 取地址运算符和指针运算符的运算优先级别规定如下 取地址运算符 指针运算符和自增 自减等单目运算符是同级别的 所有单目运算符的结合性均为自右向左 2 指针变量初始化 若有定义 inta p 语句仅仅定义了指针变量p 但指针变量并未指向确定的变量 或内存单元 因为这些指针变量还没有赋给确定的地址值 只有将某一具体变量的地址赋给指针变量之后 指针变量才指向确定的变量 内存单元 指针变量初始化 在定义指针时同时给指针一个初始值如 inta p 3 指针变量的引用 指针变量名 代表所指变量的值 指针变量名 代表所指变量的地址 有定义 inta p 注意 与 具有相同的优先级 结合方向从右到左 这样 p即 p 是对变量 p取地址 它与 a等价 p与 p 等价 a与 a 等价 6 3 2指针变量运算 1 指针的赋值运算 1 将变量地址值赋给指针变量 使指针指向该变量 设有如下定义 inta b pa pb float pf 第一行定义了整型变量a b及指针变量pa pb pa pb还没有被赋值 因此pa pb没有指向任何变量 下面语句完成对pa pb的赋值 pa 例如 intj k int pointer1 pointer2 pointer1 2 相同类型的指针变量间的赋值 pa与pb都是整型指针变量 它们间可以相互赋值 如 pb pa 即pa pb都指向变量a 此时a pa pb是等价的 指针指向变化如下图 注意 只有相同类型的指针变量才能相互赋值 如pf pa 是不允许的 因为pa是整型指针 pf是浮点型指针 给指针变量赋空值 给指针变量赋空值 说明该指针不指向任何变量 空 指针值用NULL表示 NULL是在头文件stdio h中预定义的常量 其值为 在使用时应加上预定义行 如 include stdio h int pa NULL 亦可以用下面的语句给指针赋 空值 pa 0 或 pa 0 这里指针pa并非指向0地址单元 而是具有一个确定的 空值 表示pa不指向任何变量 注意 指针虽然可以赋值0 但却不能把其它的常量地址赋给指针 例如 pa 4000 是非法的 例指针定义与初始化 main inta b int pointer 1 pointer 2 a 100 b 10 pointer 1 程序运行结果 100 10100 10 例从键盘上输入两个整数到a b 按由大到小输出 includemain inta b pa pa指向大数 pb指向小数 若输入 1222 输出结果 a 12 b 22max 22 min 12 b c 指针变化示意图 注意 数据的交换是指针变量pa和pb的值 而a和b的值并未交换 2 指针的数学运算 1 加减运算 一个指针可以加 减一个整数n 其结果与指针所指对象的数据类型有关 指针变量的值应增加或减少 n sizeof 指针类型 加减运算常用于数组的处理 对指向一般数据的指针 加减运算无实际意义 例如 inta 10 p a x x p 3 实际上是p加上3 2个字节赋给x x指向数组的第三个分量 对于不同基类型的指针 指针变量 加上 或 减去 一个整数n所移动的字节数是不同的 例如 floata 10 p a x p p 3 实际上是p加上3 4个字节赋给x x依然指向数组的第三个分量 两个指针的减法运算 如两个指针指向同一个数组元素时 这两个指针相减的结果为两者之间的元素个数 利用此方法可测出字符串的长度 2 自增自减运算 指针变量自增 自减运算具有上述运算的特点 但有前置后置 先用后用的考虑 务请小心 例如 inta 10 p a x x p x第一个元素分量 p指向第二个元素 x p x p均指向数组的第二个分量 p 相当于 p p 与 p 含义不同 前者表示地址自增 后者表示当前所指向的数据自增 3 在C中 不允许两个指针相加 相乘 相除 移位等运算 3 指针的关系运算 与基本类型变量一样 指针可以进行关系运算 在关系表达式中允许对两个指针进行所有的关系运算 若p q是两个同类型的指针变量 则 p q p q都是允许的 指针的关系运算在指向数组的指针中广泛的运用 假设p q是指向同一数组的两个指针 执行p q的运算 其含义为 若表达式结果为真 非 值 则说明p所指元素在q所指元素之后 或者说q所指元素离数组第一个元素更近些 注意 在指针进行关系运算之前 指针必须指向确定的变量或存储区域 即指针有初始值 另外 只有相同类型的指针才能进行比较 6 4指向数组的指针变量 数组是类型相同的一组变量的有序集合 这些变量在内存中按下标顺序连续存放 每一个变量都有相应的地址 而指针的概念与此紧密相连 指针和数组自然联系在一起 数组的指针是数组的起始地址 数组元素的指针是数组元素的地址 一般说 能由数组下标完成的操作 也能用指针来实现 而且后者比前者产生的目标代码占用的空间更小 运行速度更快 在实际应用中 指针所指向的对象变量很少是基本类型 大多数是构造类型 而数组是构造类型的一种 指向一维数组的指针 指向数组的指针是能够指向数组中任一个元素的指针 这种指针变量应当说明为数组元素的类型 指向数组元素的指针变量的定义与前面相同 例如 inta 10 1 3 5 7 9 int p 可以使p指向数组a中的任何一个元素 如p 把数组元素a 2 的地址赋给指针变量p 一 指向数组元素的指针变量 通常情况下 首先是使指针变量与数组的起始地址建立关连 而C语言规定 数组名代表数组的首地址 是一个地址常量 使指针指向数组中首元素 可以用更简洁的方式 因此 下面两个语句等价 p 两句 指向数组的指针变量p a 0 p 1或a 1 p 9或a 9 a 9 或 p 9 设p为指针变量 并已赋数组的一个地址 指向某个数组元素 则指针变量可参加代表数组元素的运算操作 如 a 赋值 p 28 b 参加运算 x p 6 c 自增或自减 p p 在操作时 指针和数组通常有三种对应方式 一种是数组表示法 下标 一种是指针表示法 还有一种是位移量表示法 以数组名为首地址 三种方式之间的对应关系如下 数组a中第k个元素 二 通过指针引用数组元素 数组inta 指针int p位移内容 a k p k a k 地址 则 p k和a k就是a k 的地址 p k 和 a k 是数组元素a k 综上所述 引用一个数组元素有三法 1 下标法 如a k 形式 2 指针法 p k 其中p是指向数组的指针变量 其初值p a 3 位移法 如 a k 其中a是数组名 main inta 10 k for k 0 k 10 k scanf d 例有10个整型数据 利用数组采用三种方法输出输出全部元素 1 下标法 2 位移法 通过数组名计算数组元素地址 输出元素的值 main inta 10 k for k 0 k 10 k scanf d a k for k 0 k 10 k printf 4d a k 3 指针法 用指针变量指向数组元素main inta 10 k pa pa a for k 0 k 10 k scanf d pa k for pa a pa a 10 pa printf 4d pa 三种方法的比较 第一和第二种方法执行效率是相同的 C编译程序总是将a k 转换为 a k 处理 这种方法要计算元素的地址 变址计算 故用的时间较多 而第三种方法用指针变量直接指向数组元素 不必每次都重新计算地址 故效率较高 但是下标法直观易理解 使用指针变量时 应注意 1 指针变量可以使自身的值改变 P 合法 但a 不合法 a是数组名 代表数组首地址 在程序运行中是固定不变的 2 要注意指针变量的当前值 3 p 相当于 p 因为 与 优先级相同 且结合方向从右向左 其作用是先获得p指向变量的值 然后执行p p 1 4 p 与 p 意义不同 后者是先p p 1 再获得p指向的变量值 若p a 则输出 p 是先输出a 0 再让p指向a 1 输出 p 是先使p指向a 1 再输出p所指的a 1 5 p 表示的是将p指向的变量值 1 6 指向数组元素的指针变量的值必须是有意义的 由于C对数组下标超界不作检查 因此若指针变量中的地址超出定义数组的大小范围 将会得出一个随机数 三 函数调用时数组数据的传递 前面已经讲过 数组名代表数组的起始地址 可以作为函数的形参和实参 学习了指针后 指针变量和数组可以建立关联 指针变量也可以作为函数的形参和实参 它们都是传地址方式 这样数组在函数调用时 形参和实参的对应关系有以下四种情况 形参和实参都用数组名 如 main fn intx n inta 10 fn a 10 实参用数组名 形参用指针变量 如 main fn pa n inta 10 int pa n fn a 10 函数调用时 将数组a的起始地址传给指针变量pa 相当于pa a 0 在函数fn中可以通过pa值的改变 实现对数组a中的任一个元素进行操作 实参和形参都用指针变量 如 main fn p n inta 10 int pa a int p n fn pa 10 调用时 pa的值传给p p的初始值是 a 0 通过改变p的值可对数组a的任一个元素进行操作 注意函数返回后 指针变量pa的值并未改变 实参为指针变量 形参为数组名 如 main fn x n inta 10 int pa a intx n fn pa 10 在调用时 将pa的值传给形参数组名x 使x获得a数组的首地址 即x数组与a数组共同一段存储单元 例有20个整数 找出最大数和最小数 用函数和指针完成操作 分析 函数要返回两个值 只有通过指针变量来实现 设置两个指针变量 作为函数的传递参数 main voidfind staticintx 20 23 47 11 intmax min pmax pmin pmax voidfind int p p1 p2 n intk p1 p2 p for k 1 k p p2 p p 例有n个整数 使前面各数顺序向后移m个位置 最后m个数变成最前面m个数 用函数和指针实现 原数组 设n 8 m 3 m 3 调整后 分析 数组中元素的移动 可借助于一个中间变量 其操作步骤为 将数组的最后一个元素移到中间变量 数组的n 1个元素依次向后移动 共移n 1次 将中间变量的数据送到数组的第一元素 经过上述移动 仅仅实现了m 1的情况 所以必须采用双重循环 外循环由m决定 内循环由n 1决定 关键是用指针实现操作 解 main voidmove staticinta 8 10 20 intn 8 m k printf inputmovenumberm scanf d voidmove int p k l inti j temp for i 0 i l i p p k 1 temp p for j 0 j k 1 j p p 1 p p temp 指向二维数组的指针与指针变量 二维数组的指针是在一维数组指针上的扩充 但二维数组的指针要复杂一些 关键是正确理解二维数组的性质 一 二维数组的地址 理解二维数组的地址是掌握二维数组指针的基础 以数组a 3 4 为例 它有三行四列 定义为 staticinta 3 4 1 3 5 7 9 11 13 15 17 19 21 23 可理解为 a是一个数组名 它包含三个元素 即a 0 a 1 a 2 而每个元素又是一个一维数组 它又包含4个元素 见下图表示 数组名a代表整个二维数组的首地址 按照C语言的规定 数组名代表数组的首地址 因此a代表整个二维数组的首地址 也是第0行的首地址 而a 1代表第1行的首地址 a 2代表第2行的首地址 同理 a 0 a 1 a 2 也是一维数组名 它们分别代表各行中第0列元素的地址 即a 0 是 a 0 0 a 1 是 a 1 0 a 2 是 a 2 0 应注意 a a 0 a 1 a 2 不是实际的变量 它是数组地址的一种表示方法 一维数组名a i 代表第i行的首地址 即第i行中第0列元素的地址 既 a i 0 a i j 代表第i行中的第j个元素的地址 即为 a i j 在二维数组中地址的表示非常灵活 如 a i与 a i 等价 a i j与 a i j等价 注意到a a i 都是数组名 它们不是一个实际变量 所以谈不上它的内容 a i 就是a i 这是二维数组中地址的一种特殊表示 因此 a i 并不是a i单元的内容 因为取内容运算 必须有一个确定的变量 在二维数组中用地址法表示某个元素a i j 的值 可采用如下方式 a i j 因为 a i j是a i j 的地址 注意地址变化的单位数值在不同的场合的实际字节数是不同的 a 1 中的 1 实际代表数组中一行元素所占的总字节数 a i 1 中的 1 代表数组中一个元素所占的字节数 例用指针表示法输出二维数组的各元素 includemain staticinta 2 3 0 1 2 3 4 5 intk j p for j 0 j 2 j 方式1 for k 0 k 3 k printf 5d a j k a j 是j行首地址 a j k是j行k列元素的地址 putchar n putchar n 接上页 for j 0 j 2 j 方式2 for k 0 k 3 k printf 5d a j k a j 是j行首地址 a j k是j行k列元素的地址 putchar n p a p指向数组的第一个元素 for j 0 j 2 j 方式3 for k 0 k 3 k printf 5d p 输出p所指示的元素 putchar n 输出的结果是 0 3450 3450 345 可用指针变量指向二维数组及其元素 指向二维数组的指针变量有两种情况 一是直接指向数组元素的指针变量 二是指向一个含有m个元素的一维数组 这两种不同形式的指针变量 其使用方法不同 二 二维数组的指针 1 指向数组元素的指针变量 即简单指针变量 如 int p a 3 4 p 则开始p指向数组的第一个元素 利用二维数组按行存储的特点 可以采用 p 形式来访问数组中的每一个元素 注意 1 p 4 表示p是一个指针变量 它指向包含4个元素的一维数组 即 p有4个元素 它p是行指针 只能指向包含4个元素的一维数组 而不能指向数组中的某个元素 2 p i与 p i 的区别 p i是指向第i行的指针 第i行的首地址 p i 是指向第i行第1个元素的地址 两者数值相等 但含义不同 p i的增值将以行长为单位 而 p i 增值将以元素长度为单位 3 若要用p来表示a i j 的地址 则应写成 p i j 而 p i j 则是元素a i j 的值 2 指向由m个元素组成的一维数组的指针变量定义形式 类型 指针变量 元素个数 如 int p 4 即 p i 1将指向第i行再下一行的首地址 而 p i 1将指向第i行首元素的下一个元素地址 见下图 设inta 3 4 p 4 p a 如果p先指向a 0 则p 1不是指向a 0 1 而是指向a 1 例10 10main staticinta 3 4 1 3 5 7 9 11 13 15 17 19 21 23 int p 4 i j p a scanf i d j d 三 二维数组的指针变量作函数参数 在函数调用时 二维数组的指针变量也可作函数参数 传递数组数据 有两种方法 a 用指向数组元素的指针变量b 用指向一维数组的行指针变量 例10 11 有一个4 4的矩阵 根据输入行 找出该行的最大元素 用函数和指针 main intmax staticinta 4 4 12 36 intn m scanf d intmax p k int p 4 k intmax j max p k 0 for j 1 j 4 j if max p k j max p k j return max 6 5指向的字符串的指针 字符串的指针变量字符串的操作前面已学过用字符数组来实现 这里可用指针变量来实现 即定义一个指向字符数据的指针变量 它可处理单个字符 也可处理字符串 在字符串的操作中可使用指针 其基本方法同数值型数组类似 1 字符串指针变量的定义 char 指针变量 如 staticcharx CLanguage char px x printf s px 2 结果为 Language 在C语言中 也可以不定义字符数组 而仅定义一个字符指针变量 用指针变量指向字符串的字符 如 char px CLanguage 也可写成 char px px CLanguage printf s px 这里未定义字符数组 而仅定义一个字符指针变量px px k表示串中第k个字符的地址 而 px k 表示串中第k个字符 C中对字符串常量是按字符数组处理的 在定义指针变量中 将字符串的首地址赋给指针变量px 注意px不是一个字符串变量 例如 char str Ilovechina str1 40 等价于下列两句 char str str Ilovechina 以上语句的含义 定义str为指针变量 它指向字符型数据 且赋值语句把字符串 Ilovechina 的首地址赋给了指针变量str 对字符串的整体输出实际上还是从指针所指示的字符开始逐个显示 系统在输出一个字符后自动执行p 直到遇到字符串结束标志符 0 为止 而在输入时 亦是将字符串的各字符自动顺序存储在p指示的存储区中 并在最后自动加上 0 2 用指针变量来实现对字符串的访问例10 12将一已知字符串第n个字符开始的剩余字符复制到另一字符串中 main inti n chara computer charb 10 p q p a q b scanf d 指针指到要复制的第一个字符 for p 0 p q q p q 0 字符串以 0 结尾 printf Stringa s n a printf Stringb s n b 输入 3 输出 computermputer考虑一下 若输出语句改为如下语句会如何 printf stringais s n p printf stringbis s n q 字符串数组字符串数组 是指数组中的每个元素都是一个存放字符串的数组 字符串数组可以用一个二维字符数组来存储 例如 charlanguge 3 10 数组的第一个下标决定字符串的个数 第二个下标是字符串的最大长度 实际最多9个字符 0 占一位置 可以对字符串数组赋初值 例如 charlanguge 3 10 Basic c pascal 字符指针变量与字符数组的区别用字符指针变量和字符数组都能实现字符串的运算 但两者是有区别的 主要有以下几点 组成方式不同 字符数组是由若干元素组成的 每个元素中存放一个字符 而字符指针变量中存放的是字符串的首地址 而不是整个字符串的内容 赋初值方式不同 对数组赋初值必须在静态存储的情况 而对字符指针变量则不必作存储类别说明 赋值方式不同 对字符数组只能对各个元素分别赋值 不能写成chara 10 a CProgram 对字符指针变量可用该方式赋值 char pa pa CProgram 值的可改变性 指针变量的值是可以改变的 数组名虽然代表地址 但其值是不可改变的 如下是不行的 charx cprogram x x 2 而指针变量则行 char pa cprogram pa pa 2 6 6指针形参 指针作为函数参数利用指针作函数参数 可以实现函数之间多个数据的传递 当形参为指针变量时 其对应实参可以是指针变量或存储单元地址 函数形参为指针变量 用指针变量或变量地址作实参例编写一个交换两个变量的函数 在主程序中调用 实现两个变量值的交换 程序如下 includemain inta b int pa pb voidswap int p1 int p2 函数声明 scanf d d 或 swap 接上页 voidswap int p1 int p2 inttemp temp p1 交换指针p1 p2所指向的变量的值 p1 p2 p2 temp 程序运行结果如下 输入 1222 输出 a 22 b 12 说明 指针变量作为函数参数在函数调用时 实参将它的值传给形参 形参的指针变量与实参的指针变量是指向同一个变量 因此函数中形参指针变量所指向对象发生改变 等同于主调函数中实参指针变量所指向对象的改变 如上例中 函数swap中 p1和 p2值的交换 等同main函数中a和b的值交换 在函数调用中 指针变量作为函数参数的主要用途是 函数可以返回多个变化的值 这是传地址法的特点 因为在被调函数中可以改变实参指针变量所指向变量的值 不能通过改变指针形参的值来使指针实参的值也改变 因为指针变量作为函数参数传递 也是单向的 值传递 方式 函数返回后 形参的指针变量已消失 例如 int p p p1 p1 p2 p2 p 不要希望如此完成处理 函数中交换值时不能使用无初值的指针变量作临时变量 例如 int p p p1 p1 p2 p2 p p无确定值 对p的使用可能带来不可预期的后果 说明 6 6指向多维数组的指针变量 用指针变量可以指向一维数组中的元素 也可以指向多维数组中的元素 但在概念上和使用上 多维数组的指针比一维数组的指针要复杂一些 1 多维数组元素的地址 先回顾一下多维数组的性质 可以认为二维数组是 数组的数组 例 定义inta 3 4 1 3 5 7 则二维数组a是由3个一维数组所组成的 设二维数组的首行的首地址为 则 例输出二维数组有关的值 include defineFROMAT voidmain int 3 4 1 3 5 7 9 printf printf 0 printf 0 0 0 printf 1 printf 1 0 pri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论