7.4 指针与一维数组[共8页]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 指针与一维数组