
程序设计基础 第9章 指 针 1124
第9章 指 针 程序设计基础 1/24

本章知识点 ■9.1地址和指针 ■9.2指针变量 ■9.3指向数组的指针变量 ■9.4函数指针变量 ■9.5返回指针值的函数 9.6指针数组和指向指针的指针 漫 224
本章知识点 ◼ 9.1 地址和指针 ◼ 9.2 指针变量 ◼ 9.3 指向数组的指针变量 ◼ 9.4 函数指针变量 ◼ 9.5 返回指针值的函数 ◼ 9.6 指针数组和指向指针的指针 2/24

9.3 指向数组的指针变量 9.3.1指向数组元素的指针 9.3.2通过指针引用数组元素 9.3.3数组名作函数参数 9.3.4指向多维数组的指针变量 恩 3/24
9.3 指向数组的指针变量 9.3.1 指向数组元素的指针 9.3.2 通过指针引用数组元素 9.3.3 数组名作函数参数 9.3.4 指向多维数组的指针变量 3/24

几个术语 ■数组的起始地址(数组的地址) ◆为数组分配的连续多个内存单元中第一个单元 的地址。用数组名表示。 ◆inta[5];ll数组的地址是2000,即a=2000。 ■数组元素的地址 ◆数组元素对应一个存储单元的地址。 2000 a0] ◆数组元素a[2]的地址是2008,即&a[2] 2004 a1) ■数组的指针数组的起始地址。 2008 a[2 ■数组元素的指针数组元素的地址。 2012 a[3] 2016 a[4] 4/24
◼ 数组的起始地址(数组的地址) ◆ 为数组分配的连续多个内存单元中第一个单元 的地址。用数组名表示。 ◆ int a[5]; \\数组的地址是2000,即a=2000。 几个术语 2000 a[0] 2004 a[1] 2008 a[2] 2012 a[3] 2016 a[4] ◼ 数组元素的地址 ◆ 数组元素对应一个存储单元的地址。 ◆ 数组元素a[2]的地址是2008,即&a[2] ◼ 数组的指针 数组的起始地址。 ◼ 数组元素的指针 数组元素的地址。 4/24

9.3.1 数组元素的指针 ■例如:inta[5]; ■指针变量也可以指向数组元素。 ■例如: ◆int*p; >2000 a[o] ◆p=&a[0]; 2004 a[1] 0 ◆p=&a[2]; →2008 a2] 2012 a3] 2016 a[4] A 5/24
9.3.1 数组元素的指针 ◼ 例如:int a[5]; ◼ 指针变量也可以指向数组元素。 ◼ 例如: ◆ int *p; ◆ p = &a[0]; ◆ p = &a[2]; 2000 a[0] 2004 a[1] 2008 a[2] 2012 a[3] 2016 a[4] p p 5/24

数组名代表数组的起始地址 inta[10]={1,3,5,7,9,11,13,15,17,19}; int*p;∥定义指向数组元素的指针变量 p=&a[0]; &.a[0] 1 a[o] 等价于p=a; 3 5 注意:“p=a;”的作用是“把数组a的第 7 一个元素的地址赋给指针变量p”。 9 11 定义指针变量时赋初值: 13 int *p=&a[o]; 15 int *p=a; 17 19 a[9] 通过指针引用数组元素: *p=100;lp所指向元素赋值为100 example7_3_1 息printf((“%dln”,*(p+1);Il显示p所指向元素下一个元素值 624
int a[10]={1,3,5,7,9,11,13,15,17,19}; int *p; //定义指向数组元素的指针变量 p=&a[0]; 等价于p=a; 注意: “p=a;”的作用是“把数组a的第 一个元素的地址赋给指针变量p”。 数组名代表数组的起始地址 定义指针变量时赋初值: int *p=&a[0]; int *p=a; 通过指针引用数组元素: *p=100; //p所指向元素赋值为100 printf(“%d\n”, *(p+1)); //显示p所指向元素下一个元素值 example7_3_1 6/24

引用数组元素时指针的运算 如果指针变量p已指向数组中 p,a 的一个元素,则p+1指向同一 a0] 数组中的后一个元素,p-1指 p+1,a+1 向同一数组中的前一个元素。 p1 a[1] float a[10],*p=a; a[2] ■ 假设a[0]的地址为2000, 则: p+i,a+i ● p的值为2000 a叮 p+1的值为2004 越界 p2 ● p-1的值为1996 ■如果指针p1和p2都指向同一数组。 a[6] ■ p2-p1的值是4 表示两者之间元素个数 a7] 不能p1+p2无意义 p+9,a+9 a8] a9] 恩 7/24
◼ 如果指针变量 p已指向数组中 的一个元素,则p+1指向同一 数组中的 后一个元素, p - 1 指 向同一数组中的 前一个元素。 ◼ float a[10],*p=a; ◼ 假设a[0]的地址为2000,则: p的值为2000 p+1的值为2004 p-1的值为1996 越界 a[0] a[1] a[2] ● a[i] ● a[6] a[7] a[8] a[9] p+1,a+1 p+i,a+i p+9,a+9 p, a ◼ 如果指针p1 和p2都指向同一数组 。 ◼ p2 -p1的值 是 4 表示两者之间元素个数 ◼ 不能p1+p2 无意义 p1 p2 引用数组元素时指针的运算 7/24

9.3.2通过指针引用数组元素 p,a int a[10],*p; p+1,a+1 a[O] p=a; a1] ■ p+和a+i就是a[叮的地址,它们指向数组a 的第个元素。 a[2] *(p+i)或*(a+i)是p+i或a+i所指向的数组元 素,即a叮。 p+i,a+i ● 指向数组元素的指针变量也可以带下标, *(a+i) 如p[叮与*(p+i)等价。 *p+i)】 a叮p叮 ● ■引用一个数组元素的两种方法: (1)下标法,如a[叮或p[叮 a[6] (2)指针法,如*(a+i)或*(p+i) ■ 可以通过指向数组元素的指针找到所需的 a7] 元素,使用指针法能使目标程序质量高。 p+9,a+9 a[8] a[9] 8/24
int a[10], *p; p = a; ◼ p+i和a+i就是a[i]的地址,它们指向数组a 的第i个元素。 ◼ *(p+i)或*(a+i)是p+i或a+i所指向的数组元 素,即a[i]。 ◼ 指向数组元素的指针变量也可以带下标, 如p[i]与*(p+i)等价。 a[0] a[1] a[2] ● a[i] p[i] ● a[6] a[7] a[8] a[9] p, a p+1,a+1 p+i,a+i p+9,a+9 *(a+i) *(p+i) 9.3.2 通过指针引用数组元素 ◼ 引用一个数组元素的两种方法: (1) 下标法,如 a[i] 或 p[i] (2) 指针法,如 *(a+i) 或 *(p+i) ◼ 可以通过指向数组元素的指针找到所需的 元素,使用指针法能使目标程序质量高。 8/24

例输出整型数组中的全部元素 下标法(直观) #include for(i=0;i<10;i++) int mainO printf(%d”,at); il scanf("%od",a+i); 固定指针法1 for(i=0;i<10;i+ for(i=0;i<10;i++) printf(%d”,*(a+i); scanf("%d",&a[i]); 固定指针法2int*p; for(i=0;i<10;i++) for(i=0,p=a;i<10;i++) printf((%d”,a[叮); printf(%d”,*(p+i); printf("%In"); 游动指针法(效率高)int*p; return 0; for(p=a;p<(a+10);p++) printf(%d”,*p; 3 0123456789 用指针,不检查越界 0123456789 int a[10],*p=a; 阊 printf("%d",*(p+10)) 9/24
#include int main() { int a[10]; int i; for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++) printf(“%d ”,a[i]); printf("%\n"); return 0; } 下标法 (直观) for(i=0;i<10;i++) printf(“%d ”,a[i]); 固定指针法1 for(i=0;i<10;i++) printf(“%d ”, *(a+i)); 游动指针法 (效率高) int *p; for(p=a;p<(a+10);p++) printf(“%d ”, *p); 固定指针法2 int *p; for(i=0,p=a;i<10;i++) printf(“%d ”, *(p+i)); 用指针,不检查越界 int a[10], *p=a; printf(“%d”,*(p+10)) scanf("%d",a+i); 例 输出整型数组中的全部元素 9/24

关于游动指针法 用变化的指针变量指向数组元素 #include int main() ■指针变量的值可以改变 int a[10];int *p,i; ◆如p++是合法的; for(p=a;p<(a+10);p++) ■数组名不允许改变 scanf("%d",p); ◆如a++是错误的; for(p=a;p<(a+10)p++) ◆因为数组名是指针常量。 printf(o%d”,*p月 printf("\n"); return 0; for(p=a;a<(p+10)ja++) } printf("%d",*a)i错! 恩 10/24
用变化的指针变量指向数组元素 #include int main() { int a[10]; int *p,i; for(p=a;p<(a+10);p++) scanf("%d",p); for(p=a;p<(a+10);p++) printf(“%d ”,*p); printf("\n"); return 0; } for(p=a;a<(p+10);a++) printf(“%d ”,*a); 错! ◼指针变量的值可以改变 ◆ 如p++是合法的; ◼数组名不允许改变 ◆ 如a++是错误的; ◆ 因为数组名是指针常量。 关于游动指针法 10/24