7.4 指针与一维数组[共8页]

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C 语言程序设计项目教程(第2版)

206

② strncpy 函数按指定的字符个数进行字符串赋值。函数原型为:char * strncpy(char *dest, char *src, size_t n);功能:将字符串src 中n 个字符复制到字符数组dest 中,它并不像strcpy 一样遇到NULL 才停止复制,所以desc 中可能不存在字符串结束标记NULL,必须为desc 设置字符串结束标记NULL。

③ 主程序中在定义字符数组来存放返回的出生日期及性别时,数组要有足够的大小。

7.4 指针与一维数组

1.使指针变量指向一维数组

一个变量有地址,一个数组包含若干元素,每个数组元素在内存中都占用存储单元,它们都有相应的地址,而且在内存中数组的空间是连续分配的。例如,语句int a[10] =

{1,2,3,4,5,6,7,8,9,10}; 其内存分配如图7-8所示。

指针变量既然可以指向变量,那同样可以指向数组元素。

数组元素的指针就是数组元素的地址。除此之外,指针变量还

可以指向数组,指向数组的指针变量就是数组的第一个元素的

地址——首地址。C 语言规定,一维数组的数组名代表数组的

首地址,因此数组名本身就是一个地址。其他数组元素的地址

可以通过数组名加上偏移量来取得。例如: int p = &a[0];

/ 指针p 指向数组第1个元素 / int q = &a[4];

/ 指针q指向数组中下标为4的元素 / 对于指针变量p 来说,指向的是数组中下标为0的元素,

实际上也就是指向了整个数组。

其等价于 int p = a; / 数组名a 代表数组的首地址 /

2.指针的运算

指针变量既然是变量的一种,那么它也可以进行一些运算。如上节提到的指针运算符就是取变量对应内存单元的值。

(1)算术运算

指针也能像普通变量一样进行加减的算术运算,当然其含义是不同的。例如: int a, p = &a;

p++;

这里的p++不是指把指针变量p 的值(地址)加1,而是指针向前移动1个相同基类型的内存单元。在数组中这种加减显得更有意义。

仍以图7-6所示的数组为例,语句如下。 int m;

int p = a, q,r,s; / 指针p 指向数组,即数组中下标为0的元素

/ p++; / 指针p 向下移动1个内存单元,即指向数组中下标为1的元素 /

图7-8 数组在内存中的分配

任务七 用指针实现查询、修改、添加、删除学生成绩(指针)

207

q = p + 5; / 指针p 向下再移动5个内存单元,即指向a[6] /

r = a + 5; / 由于数组名是个指针,故是从首元素向下移动5个内存单元,即指向a[5] / s = &a[1] + 2; / &a[1]即相当于指向a[1]的指针,由其向下移动2个内存单元,故指向 a[3],在此不要误以为是这个地址向下加2个字节 /

以下几行语句皆以s 指向a[3]为例。 m = s; / 取指针s 所指向内存单元的值,即将4赋给m / m = s++; / 将s 的值4赋给n,然后s 向下移动一个内存单元,即a[4] / m = ++s; / s 向下移动1个内存单元,即指向a[4],然后将s 的值5赋给n /

(s)++; / 相当于:s = s + 1; 故其更改的是s 的值,即为5,s 仍然指向a[3] / 上面的语句示例中只演示了加法运算,减法向后移动,用法同上。

这里需要注意的是数组名是指针常量,其固定指向数组中的第一个元素,不能移动。下面的语句就是错误的。 a++;

(2)关系运算

相同基类型的指针之间可以进行各种关系运算。两个指针之间的关系是指它们的目标变量的地址位置之间的关系。如图

7-7所示指针的指向,语句如下。

int m = p-q;

/

m=-5,因为q 指向a[6],p 指向a[1] / int m = q-a; / n=6 / 还可以用进行大小之间的比较。 int m = p

/ m=1,此语句为真 /

int m = (p != NULL);

/ m=1,此语句为真 / 当然,如果用指针来与普通变量比较,是没有意义的。

3.引用一维数组元素

在以前对数组的学习中,可以用“数组名[下标]”的方式引用数

组元素,而上节中通过指向数组的指针也可以访问到各个数组元素,

如图7-9所示。例如:

int a[10], p;

p = a;

对于其元素a[i]的引用有以下几种。

(a+i) 由于数组名a 是指针,用a+i 可以得到数组元素,再

用指针运算符就可以取得其对应内存单元的值。

(p+i) 同上,p 也是一个指针。

p[i]

就像 (a+i)等同于a[i]一样, (p+i)也可以写成该形式。

同样,对于数组元素的地址,下面几种写法也完全等价。

&a[i] &p[i] a+i p+i

【例7-4】 利用指针变量操作数组。

流程图如图7-10所示。 图7-9 指针与一维数组

相关文档
最新文档