第十章指针 本章重点 指针变量和指针运算符 指针用作函数参数 指针与数组。 10.1指针的基本概念 地址 在计算机中,把内存区划分为一个一个的存储单元,每个单元为 个字节(8位),它们都有一个编号,这个编号就是内存地址。如 下图所示: 低地址 C个字节 6543210 2002 2003 2004 高地址 注意:1、程序中定乂的每个数据在编译后都占有各自的内存区 2、数据所占有的存储单元个数是由其类型决定的。 3、首地址:第1个单元的地址, 4、表示地址的数与整数的区别: 5、系统通过变量名对内存单元进行访问 2.数据在内存中的存储 整型变量-分配2个字节单元 实型变量一分配4个字节单元 字符变量—分配1个字节单元
第十章 指针 本章重点: 指针变量和指针运算符。 指针用作函数参数。 指针与数组。 10.1 指针的基本概念 一、地址 在计算机中,把内存区划分为一个一个的存储单元,每个单元为 一个字节(8位),它们都有一个编号,这个编号就是内存地址。如 下图所示: 注意:1、程序中定义的每个数据在编译后都占有各自的内存区。 2、数据所占有的存储单元个数是由其类型决定的。 3、首地址:第 1 个单元的地址, 4、表示地址的数与整数的区别: 5、系统通过变量名对内存单元进行访问 2.数据在内存中的存储 整型变量---分配 2 个字节单元 实型变量—分配 4 个字节单元 字符变量—分配 1 个字节单元
例: kh 2000H 2001H3 变量 2002H 2003H 4 j变量 2006H 2007H 2.内存单元的地址与内存单元的内容 printf( %od, 1) scanf( %od, &i) 的操作过程。 3.对变量值的访问方式 (1)直接访问:按变量地址存取变量值的方式。 (2)间接访问方式:将变量的地址存放在另一个变量当中,通过 对另一变量来访问变量。 4.指针:就是变量的地址 指针变量:用于存放变量地址的变量 102指针变量和指针运算符 指针变量的定义 1.格式:类型名*指针变量名; 2、举例 int pI float *al. *a2. f: 3、说明 类型名:指针变量所指向的变量类型 b.*”是定义指针变量的标志,不可丢掉 c.指针变量定义后,其值是不确定的。 赋值:可以进行初始化,也可以使用赋值语句 (1)、初始化: *s=&a
2.内存单元的地址与内存单元的内容。 printf(“%d”,i); scanf(“%d”,&i); 的操作过程。 3.对变量值的访问方式 (1)直接访问:按变量地址存取变量值的方式。 (2)间接访问方式:将变量的地址存放在另一个变量当中,通过 对另一变量来访问变量。 4.指针:就是变量的地址。 指针变量:用于存放变量地址的变量。 10.2 指针变量和指针运算符 一.指针变量的定义 1. 格式:类型名 *指针变量名; 2、举例 int *p1; char *s1, *s2; float *a1, *a2, f; 3、说明 a. 类型名:指针变量所指向的变量类型。 b. “*” 是定义指针变量的标志,不可丢掉。 c. 指针变量定义后,其值是不确定的。 4、赋值:可以进行初始化,也可以使用赋值语句 (1)、初始化: int a, *s=&a;
(2)、赋值语句 =& 3)、注意:只能用同类型变量的地址进行赋值! 如定义:int*s; float f,则s=&f;是非法的。 二.指针变量的引用 1、两个运算符:&与* &:取地址,注意与作位运算符时的不同(双目) :取内容,注意与作乘运算符时的不同(双目) 说明 &既可作用于一般变量,也可作用于指针变量 *只能作用于指针变量 c.定义指针变量时的*与该处的含义不同 3、指针变量可以进行的操作 (1)赋值:inta,*pl=ka,*p2; 2=p1 下面的赋值是不合法的 int * ip ip=100 假设 int j=200x Int Ip &1 通过指针变量p间接访问变量 (2)输出: printi(%xpl1), (3)增减:pl+;p2-;p1+=4;(只能和一个整数) 不论指针变量指向何种数据类型,指针和整数进行加、减运 算时,编译程序总根据所指对象的数据长度对n放大。 (4).两个指针变量在一定条件下,可进行 减法运算。设p,q指向同一数组,则pq的绝对 值表示p所指对象与q所指对象之间的元素个 数 P a 例1 #include <stdio h> &al 11 main( int al=ll a2=22 int *pI, p2; 2 2 2 *p2
(2)、赋值语句 int a, *s; s=&a; 3)、注意:只能用同类型变量的地址进行赋值! 如定义:int *s; float f; 则 s=&f;是非法的。 二. 指针变量的引用 1、两个运算符:& 与 * &:取地址,注意与作位运算符时的不同(双目) *:取内容 ,注意与作乘运算符时的不同(双目) 2、说明 a. &既可作用于一般变量,也可作用于指针变量 b. * 只能作用于指针变量 c. 定义指针变量时的 * 与该处的含义不同 3、指针变量可以进行的操作 (1)赋值:int a, *p1=&a, *p2; p2=p1; 下面的赋值是不合法的: int *ip; ip=100; 假设: int i=200, x; int *ip; ip=&i; x=*ip; 通过指针变量 ip 间接访问变量 i, (2)输出:printf(“%x”,p1); (3)增减:p1++; p2--; p1+=4; (只能和一个整数) p+n 不论指针变量指向何种数据类型, 指针和整数进行加、减运 算时, 编译程序总根据所指对象的数据长度对 n 放大。 (4). 两个指针变量在一定条件下, 可进行 减法运算。设 p, q 指向同一数组, 则 p-q 的绝对 值表示 p 所指对象与 q 所指对象之间的元素个 数。 例 1 #include <stdio.h> main( ) { int a1=11, a2=22; int *p1, *p2;
1=& 2=&a2 printf( %od, %,pl, p2) p2-p1; printf( %od, %dn'*pl, *p2); 例2 #include <stdio h> a main( a t al=lla2 int *pl, "p2, p pl=&al 2 p printf( % od, %dn, pl, p2); printf( %od, %dn,*pl, 'p2) 2 例3 #include <stdio h> *p1 maino int al=lla2=22.t &al It *pl, p2 p printf( %od, %dn, al, a2); a2 t=*p1;*pl=*p2;*p2气t printf( %/od, %dn al, a2); &a2 三、指针作为函数的参数 1、形式:只需要形式参数名前加上一个*即可。 tn: void test(int *pointer, char f, char*s) 2、说明
p1=&a1; p2=&a2; printf(“%d,%d\n”,*p1,*p2); p2=p1; printf(“%d,%d\n”,*p1,*p2); } 例 2 #include <stdio.h> main( ) { int a1=11,a2=22; int *p1,*p2,*p; p1=&a1; p2=&a2; printf(“%d,%d\n”,*p1,*p2); p=p1; p1=p2; p2=p; printf(“%d,%d\n”,*p1,*p2); } 例 3 #include <stdio.h> main( ) { int a1=11,a2=22,t; int *p1,*p2; p1=&a1; p2=&a2; printf(“%d,%d\n”,a1,a2); t=*p1; *p1=*p2; *p2=t; printf(“%d,%d\n”,a1,a2); } 三、指针作为函数的参数 1、形式:只需要形式参数名前加上一个*即可。 如:void test(int *pointer, char f, char *s) 2、说明
指针作为参数可以改变主调函数中变量的值 例4:对输入的两个整数按大小顺序输出 Void Swap(int pl, int p2) i int temp p=*pl; pl=*p2, *p2=temp; 1 Void maino f int a, b I, pointer 2 scanf(%d,9%d”,&a&b) pointer 1=&a, pointer 2=&b, if (ab)swap(pointer l, pointer 2); printf("n%d,%dn”,ab); 10.3指针与一维数组( Pointer and Arrays) 通过指针访问一维数组 数组结构的分析 设有数组定义为:inta5];则有: (1)a表示数组在内存中的首地址,也就是数组中第1 个元素的首地址,它是一个地址常量,其值由系 统在编译时确定,程序运行期间不能改变。 (2)数组中的各元素表示为: a0]、a[、a[2]、a[3]、a[4 或者是: (a+0)(或*a)、*a+1)、*(a+2)、*a+3)、*a+4) (3)数组中的各元素的地址表示为 &a[0]、&a[l、&a[2]、&a[3]、&a[4] 或者是:a+0(或a)、a 2、a+3 (4)另一种解释:数组名是基地址,下标是偏移量,a就表示以a 为基地址,偏移i个元素的那个元素 (5)数组的逻辑结构如下 &a[0]&a[1]&a[2]&a[3]&a[4] ]a[l]al2]a[3]a[4] 2、指针与数组的关系 现定义一个指针变量:int*p 并进行赋值:p=a,或p=&a[0
指针作为参数可以改变主调函数中变量的值。 例 4:对输入的两个整数按大小顺序输出 Void Swap( int *p1,int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; } Void main() { int a,b; int *pointer_1,*pointer_2; scanf(“%d,%d”,&a,&b); pointer_1=&a; pointer_2=&b; if (a<b) swap(pointer_1,pointer_2); printf(“\n %d,%d\n”,a,b); } 10.3 指针与一维数组 (Pointer and Arrays) 一、通过指针访问一维数组 1、数组结构的分析 设有数组定义为:int a[5]; 则有: (1) a 表示数组在内存中的首地址,也就是数组中第 1 个元素的首地址,它是一个地址常量,其值由系 统在编译时确定,程序运行期间不能改变。 (2) 数组中的各元素表示为: a[0]、a[1]、a[2]、a[3]、a[4] 或者是: *(a+0)(或*a)、*(a+1)、*(a+2)、*(a+3)、*(a+4) (3) 数组中的各元素的地址表示为: &a[0]、&a[1]、&a[2]、&a[3]、&a[4] 或者是:a+0(或 a)、a+1、a+2、a+3、a+4 (4) 另一种解释:数组名是基地址,下标是偏移量,a[i]就表示以 a 为基地址,偏移 i 个元素的那个元素。 (5) 数组的逻辑结构如下: 2、指针与数组的关系 现定义一个指针变量:int *p; 并进行赋值:p=a; 或 p=&a[0];