清华大学出版社 TSINGHUA UNIVERSITY PRESS 目录 101指针的基本概念 10.2指向变量的指针变量 10.3指向数组的指针变量 104指向函数的指针变量和指针型函数 10.5指针型数组和指向指针的指针变量 10.6指向结构体的指针变量 107动态存储分配 返回本章首页
1 返回本章首页 目录 10.1 指针的基本概念 10.2 指向变量的指针变量 10.3 指向数组的指针变量 10.4 指向函数的指针变量和指针型函数 10.5 指针型数组和指向指针的指针变量 10.6 指向结构体的指针变量 10.7 动态存储分配
清华大学出版社 TSINGHUA UNIVERSITY PRESS 101指针的基本概念 根据内存单元的地址就可以找到所需的内存单元,通常也把 这个地址称为指针。内存单元的地址和内存单元的内容是两个不 同的概念,单元的地址即为指针,其中存放的数据才是该单元的 内容。 用一个变量来存放指针,这种变量称为指针变量。因此, 个指针变量的值就是某个内存单元的地址或称为某内存单元的指 针。为了避免混淆,我们约定:指针是指地址,是常量;指针变 量是指取值为地址的变量 种数据类型或数据结构往往都占有一组连续的内存单元。 指针是一个数据结构的首地址,它是指向一个数据结构的。 返回本章首页
2 返回本章首页 10.1 指针的基本概念 根据内存单元的地址就可以找到所需的内存单元,通常也把 这个地址称为指针。内存单元的地址和内存单元的内容是两个不 同的概念,单元的地址即为指针,其中存放的数据才是该单元的 内容。 用一个变量来存放指针,这种变量称为指针变量。因此,一 个指针变量的值就是某个内存单元的地址或称为某内存单元的指 针。为了避免混淆,我们约定:指针是指地址,是常量;指针变 量是指取值为地址的变量。 一种数据类型或数据结构往往都占有一组连续的内存单元。 指针是一个数据结构的首地址,它是指向一个数据结构的
清华大学出版社 TSINGHUA UNIVERSITY PRESS 102指向变量的指针变量 变量的指针就是变量的地址。存放变量地址的变量是指针变 量 1.指针变量的定义 对指向变量的指针变量的定义包括三个内容 1)指针类型声明符,即定义变量为一个指针变量; 2)指针变量名; 3)指针所指向的变量的数据类型。 指针变量定义的一般形式为: 类型声明符*指针变量名; 其中,*表示这是一个指针变量,类型声明符表示指针变量所 指向的变量的数据类型。 应该注意的是,一个指针变量只能指向同类型的变量。 返回本章首页
3 返回本章首页 10.2 指向变量的指针变量 变量的指针就是变量的地址。存放变量地址的变量是指针变 量。 1. 指针变量的定义 对指向变量的指针变量的定义包括三个内容: 1)指针类型声明符,即定义变量为一个指针变量; 2)指针变量名; 3)指针所指向的变量的数据类型。 指针变量定义的一般形式为: 类型声明符 *指针变量名; 其中,*表示这是一个指针变量,类型声明符表示指针变量所 指向的变量的数据类型。 应该注意的是,一个指针变量只能指向同类型的变量
清华大学出版社 TSINGHUA UNIVERSITY PRESS 102指向变量的指针变量 2.指针运算符 用户并不知道变量地址的具体值。 1)取地址运算符& 取地址运算符&是单目运算符,其结合性为自右至左,其功能 是取变量的地址。 (1)地址运算符&的一般形式为: &变量名; (2)指针变量的赋值方法 ①指针变量初始化:定义指针变量的同时对其进行初始化。 ②变量地址赋指针变量:把一个变量的地址赋给指向相同数 据类型的指针变量。 ③指针变量间相互赋值:把一个指针变量的值赋给指向相同 类型变量的另一个指针变量。 注意:不允许把一个数赋给指针变量。 返回本章首页
4 返回本章首页 10.2 指向变量的指针变量 2. 指针运算符 用户并不知道变量地址的具体值。 1)取地址运算符& 取地址运算符&是单目运算符,其结合性为自右至左,其功能 是取变量的地址。 (1)地址运算符&的一般形式为: &变量名; (2)指针变量的赋值方法 ①指针变量初始化:定义指针变量的同时对其进行初始化。 ②变量地址赋指针变量:把一个变量的地址赋给指向相同数 据类型的指针变量。 ③指针变量间相互赋值:把一个指针变量的值赋给指向相同 类型变量的另一个指针变量。 注意:不允许把一个数赋给指针变量
清华大学出版社 TSINGHUA UNIVERSITY PRESS 102指向变量的指针变量 2.指针运算符 2)取内容运算符* 取内容运算符*是单目运算符,结合性为自右至左,表示指针 变量所指的变量。 (1)可以通过指针变量间接访问变量 类型。而表达式中出现的则是一个运算符用以表示指针变量所指 的变量。 【例10_1】指针变量初始化。 include void maino t int a=5, p=&a; Press any key to continue printf (%dIn,p); 返回本章首页
5 返回本章首页 10.2 指向变量的指针变量 2. 指针运算符 2)取内容运算符* 取内容运算符*是单目运算符,结合性为自右至左,表示指针 变量所指的变量。 (1)可以通过指针变量间接访问变量 在指针变量定义中,*是类型声明符,表示其后的变量是指针 类型。而表达式中出现的*则是一个运算符用以表示指针变量所指 的变量。 【例10_1】指针变量初始化。 #include void main() { int a=5,*p=&a; printf ("%d\n",*p); }
清华大学出版社 TSINGHUA UNIVERSITY PRESS 102指向变量的指针变量 2.指针运算符 2)取内容运算符* 【例102】变量地址赋指针变量。 include 188.18 void maino 189,1 i int a, b Press any key to continue int *pointer_1, *pointer_2 a=100;b=10 pointer 1=&a; pointer 2=&b: printf(%d, %dIn", a, b) printf("%d, %dn",*pointer_1*pointer_ 2) 返回本章首页
6 返回本章首页 10.2 指向变量的指针变量 2. 指针运算符 2)取内容运算符* 【例10_2】变量地址赋指针变量。 #include void main() { int a,b; int *pointer_1, *pointer_2; a=100;b=10; pointer_1=&a; pointer_2=&b; printf("%d,%d\n",a,b); printf("%d,%d\n",*pointer_1, *pointer_2); }
清华大学出版社 TSINGHUA UNIVERSITY PRESS 102指向变量的指针变量 2.指针运算符 2)取内容运算符* (2)指针变量的值是可以改变的,即可以改变它的指向。 【例103】输入a和b两个整数,按先大后小的顺序输出a和b include void main( 3.8 i int*p1,*p2,*p, a, b: 3,b=8 向ax=8,nin=3 scanf(ood, %d, &a, &b): press any key to continue p1=8a;p2=&b; f(a<b){p=p1;p1=p2;p2=p} printf("a=%d, b=%d\n", a, b) printf("max=%d, min=%dIn"*p1, *p2) 返回本章首页
7 返回本章首页 10.2 指向变量的指针变量 2. 指针运算符 2)取内容运算符* (2)指针变量的值是可以改变的,即可以改变它的指向。 【例10_3】输入a和b两个整数,按先大后小的顺序输出a和b。 #include void main() { int *p1,*p2,*p,a,b; scanf("%d,%d",&a,&b); p1=&a;p2=&b; if(a<b) {p=p1;p1=p2;p2=p;} printf("a=%d,b=%d\n",a,b); printf("max=%d,min=%d\n",*p1, *p2); }
清华大学出版社 TSINGHUA UNIVERSITY PRESS 102指向变量的指针变量 3指针变量作为函数参数 函数的参数是指针类型将一个变量的地址传送到函数中。 【例104】输入的两个整数按大小顺序输出。现在用函数处 理,而且用指针类型的数据作函数参数。 # nclude≤ stdio. h> swap(int*p1, int*p2) i int temp; temp=*p1; *p1=*p2; *p2=temp; 1 void maino i int a, b, pointer 1, *pointer_ 2, scanf( %d, %d", &a, &b) pointer_1=&a; pointer_2=&b if(a<b swap(pointer_1, pointer_ 2); printf("max=%d, min=%dIn",a, b) 返回本章首页
8 返回本章首页 10.2 指向变量的指针变量 3. 指针变量作为函数参数 函数的参数是指针类型,将一个变量的地址传送到函数中。 【例10_4】输入的两个整数按大小顺序输出。现在用函数处 理,而且用指针类型的数据作函数参数。 #include swap(int *p1,int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; } void main() { int a,b,*pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a;pointer_2=&b; if(a<b) swap(pointer_1,pointer_2); printf("max=%d,min=%d\n",a,b); }
清华大学出版社 TSINGHUA UNIVERSITY PRESS 102指向变量的指针变量 3.指针变量作为函数参数 【例105】通过改变指针形参的值不能改变指针实参的值。 include 8 swap(int¨p1,int*p2) max=3, min=8 i int *p; p=p1; p1=p2; p2=p;1 Press any key to continue void maino t 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("max=%d, min=%din, *pointer_ 1, *pointer_2) 返回本章首页
9 返回本章首页 10.2 指向变量的指针变量 3. 指针变量作为函数参数 【例10_5】通过改变指针形参的值不能改变指针实参的值。 #include swap(int *p1,int *p2) { int *p;p=p1;p1=p2;p2=p;} 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("max=%d,min=%d\n",*pointer_1,*pointer_2); }
清华大学出版社 TSINGHUA UNIVERSITY PRESS 102指向变量的指针变量 3指针变量作为函数参数 【例10_6】输入3个整数a、b、c,按从大到小的顺序输出。 include swap(int*pt1, int*pt2) i int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; y sort(int*q1, int*q2, int*q 3) if(q1<*q 2 swap(q1, 92) 8.5 if(*q1<*q3 swap(q1, q3); 853 if(*q2<*q3 swap(q2, 3) Press any key to continuel void maino i int a, b, c,*p1,*p2,*p3; scanf( %d, %d, %d", &a, &b, &c); p1=&a;p2=&b;p3=&c; sort(p1, p2, p3); printf( "%d, %d, %d In", a,b, c) 10 返回本章首页
10 返回本章首页 10.2 指向变量的指针变量 3. 指针变量作为函数参数 【例10_6】输入3个整数a、b、c,按从大到小的顺序输出。 #include swap(int *pt1,int *pt2) { int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; } sort(int *q1,int *q2,int *q3) { if(*q1<*q2)swap(q1,q2); if(*q1<*q3)swap(q1,q3); if(*q2<*q3)swap(q2,q3); } void main() { int a,b,c,*p1,*p2,*p3; scanf("%d,%d,%d",&a,&b,&c); p1=&a;p2=&b; p3=&c; sort(p1,p2,p3); printf("%d,%d,%d \n",a,b,c); }