配色: 字号:
计算机程序设计基础(C语言)第8章 指针
2022-11-06 | 阅:  转:  |  分享 
  
第8章   指 针 8.1 指针变量 8.2 数组指针变量 8.3 指针数组和二级指针变量 8.1.1变量的指针和指针变量 内存地址
变量的地址int a=5,b=10; 一个存储单元首字节的编号称为该存储单元的“地址”,也就是相应变量的地址 在一个地址所标记的
存储单元中存放的数据称为该存储单元的“内容”。 直接访问间接访问 8.1.1变量的指针和指针变量 指针、变量的指针和指针变量指针就
是“内存单元的地址” 变量的指针就是“变量的地址”,它指向一个变量对应的内存单元。 保存指针(地址)数据的变量称为指针变量。 间接
访问 8.1.2 指针变量的定义和初始化定义指针变量的一般形式为:类型标识符 指针变量名;如: int ip;
char cp; 指针变量也可进行初始化。例如:int a ; int p=&a;8.1.3 指针变量的引用 指针变
量同普通变量一样,使用之前不仅要定义,而且必须赋予具体的值。两个有关的运算符:取地址运算符“&”:形式为: &变量名功能:得到变量
的地址,为一指针。只能作用于变量。 例如: &x, &a[5] … 等是正确的应用 &25, &(
k+1) … 等是错误的应用指针运算符(或称“间接访问” 运算符)。 一般形式为: 指针变量名如:ip表示指针变量ip所指向
的变量。【例8.1】指针运算符的示例。main( ){ int a=3,b=6, pa=&a,pb=&b;
printf("a=%2d,b=%2d\n",a,b); printf("pa=%2d,pb=%2d",pa,p
b);} int a=3,b=6;int pa=&a,pb=&b;说明:“&”和“”均为单目运算符,优先级别相同,且都
具有右结合性.&pa与&a是等价的。 &a与a是等价的。 2.对指针变量的赋值操作 可以通过赋值语句将一个有效的内存地址赋给已
定义的指针变量 int a,pa; pa=&a; pa=3; 说明:指向相同类型的指针变
量之间可以相互赋值。int a=3,pa=&a,pb; pb=pa; pb+=1;int p;p=NULL;
或:p=0; a+=1;a=3;NULL为系统定义的符号常量.代表整数0.main(){ int a,b,c,pmax,p
min; printf("input three numbers:\n"); scanf("%d%d%d",&a,&b,&c); 
if(a>b) { pmax=&a;pmin=&b; } else { pmax=&b; pmin=&a;
} if(c>pmax) pmax=&c; if(c nmin=%d\n",pmax,pmin);} 【例8.2】利用指针变量求出三个数中的最大值和最小值。 【例8.3】 使两个
指针变量交换指向。 main() { int a1=10, a2=20; int p1,
p2, p; p1=&a1; p2=&a2; printf(“ %d,%d
,&d,&d\n”,p1,p2,a1,a2); p=p1; p1=p2; p2=p;
printf(“ %d,%d,%d,%d\n”,p1,p2,a1,a2); }10,20,10,
2020,10,10,20【例8.4】 交换两个指针变量所指向的变量的值。 main() { int a1=10, a2=
20, t; int p1, p2; p1=&a1; p2=&a2;
printf(“ %d,%d,%d,%d\n”,p1,p2,a1,a2);
t=p1; p1=p2; p2=t; printf(“ %d,%d,%d,
%d\n”,p1,p2,a1,a2); }10,20,10,2020,10,20,108.2数组指针变量 8.2.1 数组指针
变量的定义和引用 1.数组指针变量的定义一般形式为:类型标识符 指针变量名 例如:int a[6],pa; p
a=a; / 数组名a是数组的首地址 / 或 pa=&a[0]; 也可以 int a[6],pa=a;或 int
a[6],pa=&a[2];2.数组指针变量的引用(1)数组指针变量与整数的加减算术运算 如: pa+n,pa-n,p
a++,++pa,pa--,--pa (2)两数组指针变量的减运算两个指针是不能相加的 (3)数组指针变量的关系运算 以存储单元为
单位加减p1==p2p1p2p1==0p1!=03.数组元素的引用① pa+i和a+i就是a[i]的地址。② (pa
+i)、(a+i)与a[i]是等价的。“[ ]”实际上是变址运算符,即将a[i]按a+i计算地址,然后在此地址中存取所需数据。
③ 注意,(a+n)与 a+n是完全不同的。 ④ 指向数组的指针变量,也可将其看作是数组名,因而可按下标法使用。如 pa[i
]与 (pa+i)等价。 访问一维数组元素,可以用以下两种方法:下标法,即用a[i]或pa[i]的形式访问数组元素。指针法,即采
用(pa+i)或(a+i)的形式访问数组元素。所以: 对a[i]的引用可以使用: (1) a[i] ; (2)
(a+i); (3) (pa+i); (4) pa[i];【例8.5】利用数组指针变量实现一维数组元素的
输入和输出 #include "stdio.h"main(){int a[6],i,pa;  pa=a;
 for(i=0;i<6;i++) { pa=i; pa++; } pa=a;  for
(i=0;i<6;i++) { printf("a[%d]=%d\n",i,pa); pa++; }} 注意
:pa++与(pa)++的含义【例8.6】用数组指针变量顺序输出二维数组元素的值。 for(i=0;i<12;i++) {
if (i%4)==0 printf(“\n”); printf(“%4d”,p++);
}aaaa+0aa[0]aa[0]+j(aa[0]+j)((aa+0)+j)int [4]int二维数组元素a[i][j
]aa+1aa[1]aa[1]+j(aa[1]+j)((aa+1)+j)aa+2aa[2]aa[2]+j(aa[2]+j)
((aa+2)+j)(aa[i]+j)((aa+i)+j)1. 二维数组的指针 int aa[3][4](aa
+0)(aa+1)(aa+2)8.2.2 二维数组指针9.2.3 二维数组的指针【例8.7】二维数组的指针示例9.2.3 二
维数组的指针对于指向二维数组的指针变量p,可以有两种:一种是指向数组元素的 另一种是指向行的,这时,p不是指向一个具体的数组元素,
而是指向一个包含m个元素的一维数组。 这种指向一行的数组指针变量,称为行数组指针变量,简称行指针相应的将指向二维数组元素的指针变量
称为列数组指针变量,简称列指针。 2.指向二维数组的指针变量行指针的定义形式如下: 类型标识符 (指针变量名)[长
度];例如:int (pa)[4],aa[3][4]; pa=aa; 访问二维数组元素,可以用以下两种方法:下标法,用aa[i]
[j]或pa[i][j]的形式访问数组元素。指针法,采用((pa+i)+j)或((aa+i)+j)或(pa[i]+j)或
(aa[i]+j)的形式访问数组元素。9.2.3 二维数组的指针例如:int (pa)[4];pa=aa;8.2.3指针与字符
串1.字符串的表示形式(1)用一维字符数组表示【例8.8】 用一维字符数组表示字符串示例8.2.3 指针与字符串(2)用字符型指
针变量表示【例8.9】用字符型指针变量表示字符串示例1.字符串的表示形式【例8.10】 将字符串a复制到字符串b【例8.11】
用字符型指针变量来处理【例8.10】。3. 字符指针变量与字符数组小结 (1) 存储内容不同:字符数组存储的是字符串本身,每个
数组元素存放一个字符;而字符指针变量存放的是字符串的首地址。 (2) 赋值方式不同。对字符数组只能对各个元素赋值,不能用以下办法
对字符数组赋值。 char str [20]; str="I am happy";而对字符指针变量,可以采用
下面方法赋值: char pa; pa="I am happy";或 char
pa="I am happy";但注意赋给pa的不是字符,而是字符串的首地址。(3) 字符指针变量的值是可以改变的;而字符数
组名代表字符数组的起始地址,是一个常量,不能改变。8.3 指针数组和二级指针变量8.3.1 指针数组指针数组的定义形式为: 类
型标识符 数组名[长度];其中:“类型标识符”指明指针数组各元素所指向的对象的数据类型。例如: int pc[5];定义了一个长度为5的指针数组pc,它的每个数组元素都可指向一个整型变量(或存放一个整形变量的指针)。 注意:不要写成int(pc)[5]【例8.13】 分析下列程序的输出结果。【例8.14】 将若干地名按字母顺序(由小到大)输出。 8.3.2 二级指针变量 定义二级指针变量的一般形式为: 类型标识符 指针变量名;例如:实现图8.13的定义语句为: int a,pa=&a,pp=&pa;【例8.15】 二级指针变量的使用。
献花(0)
+1
(本文系籽油荃面原创)