首页 资讯 应用 高压 设计 行业 低压 电路图 关于

单片机

旗下栏目: PLC 嵌入式 单片机 DCS

C#数组与字符串

单片机 | 发布时间:2017-11-22 | 人气: | #评论# | 本文关键字:C#,数组,字符串
摘要:第八章 数组与字符串 8.1 数组的意义 开学时,常填写课程表;到由于划拨订杂志时,常填写划拨单。无论是填写课程表还是填写划拨单,皆把数据填入“表格”(Table)中。人们使用表格来记

第八章 数组与字符串

8.1 数组的意义

开学时,常填写课程表;到由于划拨订杂志时,常填写划拨单。无论是填写课程表还是填写划拨单,皆把数据填入“表格”(Table)中。人们使用表格来记录数据,计算机则常使用“数组”(Array)储存数据。

课程表前表格,垂直方向分为“列”(Row),水平方向分为数“行”(Column)。在日常生活中,常见各式各样的表格,例如制作一份月历,如图8-1所示。

第八章 数组与字符串

 图8-1

这是表格,依照垂直及水平方向分为“列”及“行”。此为2维空间表示法。在计算机中,用来储存这种数据的数组,称为“2维数组”(2-Dimensional Array)。那么,如何将整个月历存入计算机呢?答案是:须使用“3维数组”(3-Dimension Array)来储存。除了表格外,数学上常用“矩阵”(Matrix)表示有次序的数据,例如:

第八章 数组与字符串 - ziye334 - ziye334的博客

       计算机的2维数组能存储矩阵A的数据,1维数组则能存储向量B的数据。除了上述的1维、2维及3维数组外,还有4,5,···, N维数组,应有尽有。写C程序时,应善用数组来储存有组织有顺序的数据。 8.2 一维数组

声明变量时,计算机分配空间给变量,这样变量就能储存数据了。一个变量只能储存一项数据(整数、浮点数或字符等)。“数组”(Array)也必须声明要求计算机分配空间,这样数组就能储存表格或向量数据了。例如,欲将Art及Science两个科目的成绩存入计算机中,并求平均分数。可写程序代码如下:

float course[2];

course[0] = 98.5;

course[1] = 88.0;

printf("AVERAGE = %.1f", (course[0] + course[1])/2);

course[]是数组,此时,course[]数组拥有8个Bytes空间,如图8-2所示。

第八章 数组与字符串

 图8-2

其中都course[0]代表左边4 Bytes空间,course[1]代表右边4 Bytes空间。course[0]及course[1]是course[]数组的“元素”(Element)。course数组为float类型,意味着course[0]及course[1]两个元素皆为float类型,所以course[0]及course[1]各占4 Bytes空间。而且course[0]与course[1]的空间紧密相连在一起。因此,数组数据井然有序地储存于计算机中。此时course[]值为(如图8-3所示):

第八章 数组与字符串

 图8-3

最后,course[0]加上course[1]并计算平均数。

但是,请留意数组有两项特性:

· 每一元素的类型均相同。

· 借“索引”(Subject)来区别元素,且最小索引值为0。

8.3 一维数组与指针

数组是由一串变量(元素)所组成。因此,指针能指向数组内的任一元素。即,可借指针来存取数组内的元素。所以除了传统的数组存取方法之外,还可利用更高效的指针处理方法。如何让令指针指向数组的元素呢?请看下面的例子。

int data[3];

int *px, *py;

data[0] = 5;

data[1] = 28;

data[2] = 78;

px = &data[0];

py = &data[1];

data[2] += *px + (*py)++;

printf("%d, %d, %d\n", data[0], data[1], data[2]);

data[]为整数数组,px及py为整数指针。指令px = &data[0]是表示px指向元素data[0]。既然px指向data[0],就可用*px来替代data[0],亦即可用*px来存取data[0]的内容了。

同理,指令py = &data[1]令py指向data[1]元素,此时可用*py代替data[1],亦即可用*py存取data[1]的内容了,如图8-4所示。

第八章 数组与字符串

 图8-4

接下来,指令data[2] += *px + (*py)++运算之后,data[]数组的内容变为如图8-5所示:

第八章 数组与字符串

 图8-5

数组含有很多元素,这些元素储存于内存中,且相连在一起。px指针能指向data[0],也能指向下一个元素data[1]。令px指向data[1]的方法有以下两种。

· 使用指令——px = &data[1]

这是您所熟悉的方式。

· 使用指令——

px = &data[0]

px++

px++令px指向下一个元素。借此方法,就要可令px依序指向数组的任一元素了。

指针的移动方法是基本技巧,愈熟练便愈能写出高效率的程序。请您看下面一个数组的例子,其内容如图8-6所示。

第八章 数组与字符串

 图8-6

这是直角三角形的边长:斜边长为5.0,另一边边长为4.0,第三边长度未知。可写一个程序来计算第三边的长度,如下:

double sides[3];

double *k1, *k2, *k3;

sides[0] = 5.0;

sides[1] = 4.0;

k1 = &sides[0];

k2 = k1 + 1;

k3 = k1 + 2;

*k3 = sqrt(pow(*k1, 2.0) - pow(*k2, 2.0));

printf("the 3rd side is: %.1f", *k3);

指令k1 = &sides[0]让k1指向sides[0]。指令k2 = k1 + 1让k2指向k1所指元素的下一个元素,即k2指向sides[1]。指令k3 = k1 + 2让k3指向k1所指元素的下两个元素,即k3指向sides[2],如图8-7所示。

第八章 数组与字符串

 图8-7

pow()函数用来计算次方值,例如:要计算2的三次方,写为pow(2.0, 3.0)就可求出其值8.03。sqrt()函数用来计算平方根,例如:要计算2的平方根,可写为sqrt(2.0)就可计算出其值为1.414。

目前,*k1的值为5.0,*k2的值为4.0。

所以,指令    *k3 = sqrt(pow(*k1, 2.0) - pow(*k2, 2.0))

相当于     *k3 = sqrt(pow(5.0, 2.0) - pow(4.0, 2.0))

sqrt()求平方根3.0存入*k3的位置中,使得sides[]数组的内容如图8-8所示。

第八章 数组与字符串

 图8-8

printf()将*k3值显示出来the 3rd side is: 3.0。请注意:sqrt()及pow()函数皆定义于math.h头文件,所以程序应加上指示:

#include <math.h>

这个程序使用了k1,k2及k3共三个指针,实在太浪费了。如何才能较为经济呢?想一想,当计算机执行到指令k2 = k 1 + 1时,k2值等于k1 + 1的值,亦即k2指向side[1],同时k1 + 1也指向sides[1],如图8-9所示。

第八章 数组与字符串

 图8-9

因此,    *k2 ≡ *(k1 + 1) ≡ sides[1]

同理,    *k3 ≡ *(k1 + 2) ≡ sides[2]

      *(k1 + 1)代表着*k1之后的第一个元素

      *(k1 + 2)代表着*k1之后的第二个元素

      ......

      *(k1 + n)代表着*k1之后的第n个元素

例如,当p指向x[]时,x[i] ≡ *(p + i),如图8-10所示。

第八章 数组与字符串

 图8-10

在C程序中,数组名有其特殊又重要的用法。对于初学者,刚开始会感到有点莫名其妙。请回忆下列指令:

......

char a[4], *p;

p = &a[0];

......

这些指令让指针p指向a[0]数组的开头,就能使用*(p+1)代替a[1]、以*(p + 2)代替a[2]等等,如图8-11所示。

第八章 数组与字符串

 图8-11

重要的观念是,数组的名称a永远代表着&a[0]的值。

因此,指令     p = &a[0];

相当于      p = a;

由于a值等于p值,可推知,如图8-12所示。

第八章 数组与字符串

图8-12

在C程序中,下列规则永远成立:

                     &a[0] ≡ a

指令                     p = a;

相当于                           p = &a[0];

令p指向a[]数组,即让p指向a[0]元素。接下来,while循环显示出a[]数组JCN。虽然,指令:

p= a;

令p值等于a值,但p与a有个重大区别:“p是指针变量;但a是指针常数”

由于a是常数,其值永远固定不变,所以a[i]永远相当于*(a+i)。然而,p是变量,其值会改变,因而*(p+i)未必等于a[i]。请特别留心,在什么情况下,*(p+i)才会等于a[i]呢?答案是:如果p正指向a[0],则*(p+i)相当于a[i]。

所以,归纳一下简答规则:

· 如果a是常数,则a[i]永远等于*(a+i)。

· 如果p是指针(变量),则a[i]未必等于*(p+i);仅当p正指向a[0]时,a[i]才等于*(p+i)。

责任编辑:电气自动化网
首页 | 电气资讯 | 应用技术 | 高压电器 | 电气设计 | 行业应用 | 低压电器 | 电路图 | 关于我们 | 版权声明

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版 原创声明:本站大部分内容为原创,转载请注明电气自动化网转载;部分内容来源网络,如侵犯您的权益请发送邮件到[email protected]联系我们删除。