C语言程序设计 指针、数组和地址的关系
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
练习:写出程序的运行结果
#include<stdio.h> int main( ) {
int x[10] = {1,2,3,4,5,6,7,8,9,0}; int *p = x;
printf(“%d\t”,*p++); printf(“%d\t”,*(p+8)); printf(“%d\n”,*--p);
sum = sum + p[i]; 正如表达式*(a+i)与 a[i]等价一样,表达式*(p+i)与 p[i] 等价。 虽然在很多方面数组和指针都能处理同样的问题,但是他们有本质的区别,数组名 是指针常量,象 a = a + 1 是非法的。
6.2.3 指针运算
指针运算是 C 语言的重要特征之一,如果变量 p 是指向某个指定类型变量的指针,表达 式 p+1 代表访问该类型的下一个变量的内存地址。象 p++,--p,p=p+i 这样的表达式都是有 意义的。
printf ("%d\n", q - p); /* 计算 p 和 q 之间的数组元素的个数*/ printf ("%d\n", (int) q - (int) p); /* 计算 p 和 q 之间的字节数*/
return 0; }
运行结果 1 4
程序中在指针变量前加强制转换(int),是得到两个 float 型数组元素所在的内存首地 址,再进行算术运算得到结果为 4。
return 0; }
运行结果为:
1
0
1
说明:
(1) p++使指针 p 指向数组的下一个元素。
(2) *p++等价于*(p++),其作用是先得到 p 指向变量的值(即*p),然后再使 p+1→
p
(3) *(p++)与*(++p)的作用不同。前者是先取*p 的值,然后使指针变量 p 加 1;后
者是先使指针变量 p 的值加 1,再取*p。
如果 p 和 q 是指针变量,p-q 表示 p 和 q 之间的数组元素的个数。 【例 6-5】使用指针计算数组元素个数和数组元素的存储单元数
程序如下:
/*程序名:6_5.c*/
# include <stdio.h>
int main (void) {
float a[3], *p, *q;
p = &a[0]; q = p + 1;
p+1
2004
1
a[1]
p+2
2008
2
a[2]
p+3
2012
3
a[3]
p+4
2016
4
a[4]
p+5wk.baidu.com
2020
5
a[5]
p+6
2024
6
a[6]
p+7
2028
7
a[7]
对数组元素求和可以用以下方法: (1)sum = 0;
for( p = a; p <= &a[7]; p++) sum = sum + *p; 指针变量 p 的初值是数组的起始地址,p 连续取值&a[0]…&a[7]。 (2)sum = 0; for( i = 0 ; i < 8; i++) sum = sum + *(a + i); 表达式*(a+i)与 a[i]等价。 (3)sum = 0; for( i = 0 ; i < 8; i++)
p=a; p=&a[0]; 同样以下两句话也是等价的: p=a+1; p=&a[1]; 表 6-7 给出了数组和指针的关系。在 VC 环境下,每个 int 型的变量占 4 个字节),假 设 2000 是数组的起始地址。
表 6-7 数组和指针的关系
指针 内存地址 内存单元 数组元素
p
2000
0
a[0]
(4)(*p)++表示 p 所指向的元素值加 1。 把++和--运算符用于指针变量处理数组十分有效,可以使指针变量自动向前或向后移动,指 向下一个或上一个数组元素,但使用时如果不小心,很容易出错。
6.2.2 指针、数组和地址的关系
在声名数组时,编译器必须分配起始地址和足够的存储空间,以存储数组的所有元素。 数组名本身是一个地址即指针值。指针是以地址为值的变量,而数组名的值是一个特殊的固 定地址,可以把它看做常量指针。
例如: int a[8]={0,1,2,3,4,5,6,7,},*p;
系统给 8 个数组元素分配了连续的存储空间。 数组名是一个地址常量,因此以下两句话是等价的:
#include<stdio.h> int main( ) {
int x[10] = {1,2,3,4,5,6,7,8,9,0}; int *p = x;
printf(“%d\t”,*p++); printf(“%d\t”,*(p+8)); printf(“%d\n”,*--p);
sum = sum + p[i]; 正如表达式*(a+i)与 a[i]等价一样,表达式*(p+i)与 p[i] 等价。 虽然在很多方面数组和指针都能处理同样的问题,但是他们有本质的区别,数组名 是指针常量,象 a = a + 1 是非法的。
6.2.3 指针运算
指针运算是 C 语言的重要特征之一,如果变量 p 是指向某个指定类型变量的指针,表达 式 p+1 代表访问该类型的下一个变量的内存地址。象 p++,--p,p=p+i 这样的表达式都是有 意义的。
printf ("%d\n", q - p); /* 计算 p 和 q 之间的数组元素的个数*/ printf ("%d\n", (int) q - (int) p); /* 计算 p 和 q 之间的字节数*/
return 0; }
运行结果 1 4
程序中在指针变量前加强制转换(int),是得到两个 float 型数组元素所在的内存首地 址,再进行算术运算得到结果为 4。
return 0; }
运行结果为:
1
0
1
说明:
(1) p++使指针 p 指向数组的下一个元素。
(2) *p++等价于*(p++),其作用是先得到 p 指向变量的值(即*p),然后再使 p+1→
p
(3) *(p++)与*(++p)的作用不同。前者是先取*p 的值,然后使指针变量 p 加 1;后
者是先使指针变量 p 的值加 1,再取*p。
如果 p 和 q 是指针变量,p-q 表示 p 和 q 之间的数组元素的个数。 【例 6-5】使用指针计算数组元素个数和数组元素的存储单元数
程序如下:
/*程序名:6_5.c*/
# include <stdio.h>
int main (void) {
float a[3], *p, *q;
p = &a[0]; q = p + 1;
p+1
2004
1
a[1]
p+2
2008
2
a[2]
p+3
2012
3
a[3]
p+4
2016
4
a[4]
p+5wk.baidu.com
2020
5
a[5]
p+6
2024
6
a[6]
p+7
2028
7
a[7]
对数组元素求和可以用以下方法: (1)sum = 0;
for( p = a; p <= &a[7]; p++) sum = sum + *p; 指针变量 p 的初值是数组的起始地址,p 连续取值&a[0]…&a[7]。 (2)sum = 0; for( i = 0 ; i < 8; i++) sum = sum + *(a + i); 表达式*(a+i)与 a[i]等价。 (3)sum = 0; for( i = 0 ; i < 8; i++)
p=a; p=&a[0]; 同样以下两句话也是等价的: p=a+1; p=&a[1]; 表 6-7 给出了数组和指针的关系。在 VC 环境下,每个 int 型的变量占 4 个字节),假 设 2000 是数组的起始地址。
表 6-7 数组和指针的关系
指针 内存地址 内存单元 数组元素
p
2000
0
a[0]
(4)(*p)++表示 p 所指向的元素值加 1。 把++和--运算符用于指针变量处理数组十分有效,可以使指针变量自动向前或向后移动,指 向下一个或上一个数组元素,但使用时如果不小心,很容易出错。
6.2.2 指针、数组和地址的关系
在声名数组时,编译器必须分配起始地址和足够的存储空间,以存储数组的所有元素。 数组名本身是一个地址即指针值。指针是以地址为值的变量,而数组名的值是一个特殊的固 定地址,可以把它看做常量指针。
例如: int a[8]={0,1,2,3,4,5,6,7,},*p;
系统给 8 个数组元素分配了连续的存储空间。 数组名是一个地址常量,因此以下两句话是等价的: