C语言课程设计教程第八章地址和指针(章节带习题)

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

比如输入: 41 32<CR>
a=41 b=32
min=32
8.4 对指针变量的操作
8.4.2 移动指针 && 8.4.3 指针比较
所谓移动指针就是对指针变量加上或减去一个整数,或通过赋值运算,使指针变量 指向相邻的存储单元。
假定在内存中开辟了如图所示的五个连续的、存放int类型整数的存储单元,并分别给 它们取代号为:a[0]、 a[1]、 a[2]、 a[3]、 a[4]。 这些代号所代表的存储单元中,分别有值为:11、22、33、44、55。
sum
z
的变量全部释放。
printf(“Enter x,y:”); scanf(“%d%d”,&x,&y);
z=myadd(&x,&y);
printf(“%d+%d=%d\n”,x,y,z);
65
}
Enter x,y: 24 41<CR> 24+41=65
8.5 函数之间地址值的传递
8.5.2 通过传递地址值在被调用函数中直接改变调用函数中的变量的值
当访问变量时,为“直接存取(直接访问)”。 我们也可以通过指针变量间接的访问该地址中原来的值。此时 称为“间接存取(间接访问)”。
8.2 指针变量的定义和指针变量的基类型
定义指针变量的一般形式如下: 类型名 *指针变量名; 或 类型名 *指针变量名1, *指针变量名2,……;
例如:int *pi; int *pj,*pa;
q=&k; p=q;
输出时,变量k为1,而指针变量q和p则为变量k的地址。
printf(“%d\n%d\n%d\n",k,q*q,p,*)p; );
} k
q
p
访问时,在指针变量前在*(间接访问运算符)则
1
&k &k
表示访问该地址中原来的值。
8.4 对指针变量的操作
8.4.1 通过指针来引用一个存储单元
第8章 地址和指针
8.1 变量的地址和指针 8.2 指针变量的定义和指针变量的基类型 8.3 给指针变量赋值 8.4 对指针变量的操作 8.5 函数之间地址值的传递
考试的重点
8.1 变量的地址和指针
计算机的内存是以字节为单位的一片连续的存储空间,每一个字节都有一个
编号,这个编号就成为内存地址。
内存空间 地址
1010 1011 a 3 1012 1013 1014 b 5 1015 1016
:: ::
例如:short a,b; float x; a=3;b=5;x=3.5;
每个变量的地址是指该变量所占 存储单元的第一个字节的地址。
在C语言中,我们可以定义整型变量、实型变量、字符变量。 他们都是用来存放数据的。 今天,我们来学习一下特殊的变量,这种变量只是用来存放 内存地址的。
知识点:
由于把变量k的地址赋予了指针变量q,q中现在存放的就是变量k的地址, 这时可以说:q指向了变量k。
指针变量之间也可以进行赋值:p=q;
当我们输出变量k,q,p时,输出的结果为;
1 1245052 1245052
8.3 给指针变量赋值
8.3.2 给指针变量赋“空”值
除了给指针变量赋地址值之外,还可以给指针变量赋一个特殊的值,该值为“空”值。
20
8.4 对指针变量的操作
8.4.1 通过指针来引用一个存储单元
程序举例:
例8.1 用指针指向两个变量,通过指针运算选出值最小的那个数。
#include <stdio.h>
pa
a
main()
scanf(“%d%d”,&a,&b
{int a,b,min,*pa,*pb,*pmin; ); pa=&a;pb=&b;pmin=&min;
例8.2 程序举例。 #include <stdio.h>
a
x
int myadd(int *a,int *b)
{int sum;
sum=*a+*b; 传递
sum=x+y;
b
y
return sum;
}
main()
{int
x,y,z;
调 用
退出函数,将变量sum的值作
为这个函数的返回值,返回到
他的调用处。此时,该函数中
A4
B6
C8
D 10
8.5 若指针p已正确定义并指向如图所示存储单元: B
则执行语句*p++; 后,*p的值是
A 20
B 30
C 21
D 31
8.6 若指针p已正确定义并指向如图所示存储单元,则*++p的值是 B
}
退出该函数,返回到它的调用处, 该函数无返回值,因为该函数为 void类型,此时该函数中的变量全
部释放。
(1)x=30 y=20 (2)a=30 b=20 (3)a=20 b=30 (4)x=20 y=30
8.5 函数之间地址值的传递
8.5.2 通过传递地址值在被调用函数中直接改变调用函数中的变量的值
elseif(p==‘\0’) printf(“p points to NULL.\N”); printf(“q points to lower memory than p.\n”)
p points to lower memory than q.
8.5 函数之间地址值的传递
8.5.1 形参为指针变量时实参和形参之间的数据传递
pb
b
scanf(“%d%d”,pa,pb); /*输入的值依次放入pa、pb所指存储单元中*/
printf(“a=%d b=%d\n”,a,b);
pmin
min
*pmin=*pa;
min=a;
4312
if(*pa>*pb) *pmin=*pb;
printf(“min=%d\n”,min);
}
if(a>b) min=b;
j
b
main()
{int *p,i,j;
printf("Enter two number:"); scanf("%d%d",&i,&j);
p=fun(&i,&j);
printf("i=%d,j=%d,*p=%d\n",i,j,*p);
}
传递
int *fun(int *a,int *b)
{if(*a>*b) return a; if(i>j) return a;
int *p; p=NULL;
int *p; p=0;
int *p; p=‘\0’;
注意
此时,指针变量p中不是没有值,而是有一个“空”值。
8.4 对指针变量的操作
8.4.1 通过指针来引用一个存储单元
#include <stdio.h> main() {int k,*q,*p;
k=1;
11 12451052 12451052
说明:
1. pi,pj,pa都是变量,不过都是指针变量,定义时在普通变量名的左边加上星号就行了。
2. pi,pj,pa三个指针变量的类型为整型,说明三个变量中只能存放int类型变量的地址。 这时我们称int是指针变量pi,pj,pa的基类型。
如:double *pd; pd的基类型为double类型,在指针变量pd中,只能存放double类型变量的地址。 char *s1,*s2; s1和s2的基类型为char类型,在指针变量s1和s2中,只能存放char类型变量的地址。
8.3 给指针变量赋值
8.3.1 给指针变量赋地址值
例如:int k,*q,*p; /*k为整型变量,q和p都是指针变量。*/
k=1;
/*给普通变量赋值*/
q
k
整型变量k只被能赋予整型值,赋值时直接赋值就可以
了,而指针变量只能被赋予地址值,如下是把整型变
量k的地址赋值给指针变量q。
p
q=&k;
&是用来求出变量的地址。
习题
a[0] a[1]
a[2]
a[3]
a[4]
10
20
30
40
50
8.4 若有以下程序: C
#include <stdio.h>
p
main()
{int k=2,m=4,n=6,*pk=&k,*pm=&m,*p;
*(p=&n)=*pk*(*pm); printf("%d\n",n);
}
程序的输出结果是
例8.4 编写函数order(int *a,int *b),使调用函数中的第一个实参总是存放两个数中 的较小的数,第二参数存放两个数中较大的数。
#include <stdio.h>
void swap(int *x1,int *x2) {int t;
a
x
x1
t=*x1;*x1=*x2;*x2=t;
t=x;x=y;y=t;
A pb=&x
B pb=x
8.2 若有以下程序: B
C *pb=&x
#include <stdio.h>
main()
{printf(“%d\n”,NULL);} 程序的输出结果是
A 因变量无定义输出不定值 B 0 C -1 8.3 若有以下程序: B
#include <stdio.h>
void sub(int x,int y,int *z)
a[0] a[1]
a[2]
a[3]
a[4]
11
22
33
44
55
p
p
q
q
q
例如:int *p,*q; q=p+2; 当有:int i,j,k;
p=&a[0]; q++;
i=*p;j=*q;k=q-p;
q++; q--;
i
j
k
p++; 22
44
2
指针比较
if(p<q) printf(“p points to lower memory than q.\n”)
return b;
}
退出该函数,返回到它的调用处, 该函数的返回值是一个地址(j的地 址),所以该函数是一个指针类型。 退出时该函数中的变量全部释放。
Enter two number:99 101<CR> i=99,j=101,*p=101
习题
一.选择题 8.1 若有定义:int x,*pb;则正确的赋值表达式是
{ *z=y-x; }
main()
{int a,b,c;
sub(10,5,&a); sub(7,a,&b); sub(a,b,&c);
printf("%d,%d,%d\n",a,b,c);
} 程序的输出结果是
A 5,2,3
B -5,-12,-7
C -5,-12,-17
A D *pb=*x
D1
D 5,-2,-7
24
}
void order(int *a,int*b)
调用并传递数据
b
y
x2
{if(*a>*b) swap(a,b); if(x>y) swap(a,b);
}
41
main() 调 传递 {int x,y; 用
printf("Enter x,y:"); scanf("%d%d",&x,&y);
printf("x=%d y=%d\n",x,y); order(&x,&y);
j=*(&i);
jຫໍສະໝຸດ Baidu*&i;
j 10
扩展知识:
int *p,k=0; p=&k; *p=100; *p=*p+1;
j=*p+1; p
k=k+1;
j 11 k 0
k=100;
*p+=1; 或 ++*p; 或 (*p)++;
若有以下定义和语句:
int **p,*s,k=20; s=&k;
p
s
k
p=&s;
假定有以下定义和语句:
p
i
int *p,i=10,j; /*定义了三个变量*/
10
p=&i;
/*取变量i的地址赋给指针变量p*/
j
j=*p;
/*间接访问指针变量中的值10赋给变量j*/
j=i;
间接访问运算符*是一个单目运算符,必须出现在运算对象的左边。其运算对象 可以是存放地址的指针变量,也可以是地址。
例8.3 调用swap函数,交换主函数中变量x和y中的数据。 第七章例7.3的重写
#include <stdio.h> void swap(int *,int *);/*函数说明语句*/ main() {int x=30,y=20; printf("(1)x=%d y=%d\n",x,y); swap(&x,&y);
1200
x
1201
3.5 1202 1203
1204
: 12:05
::
比如我们定义了一个指针变量p 占4个字节
该变量中只能存放内存地址,比如把变量a的地址赋予指针 变量p,则指针变量p的值为1012。
请问
当访问变量a时,访问的是什么? 3 当访问指针变量p时,访问的是什么?1012
1012
2002 2003 2004 2005
Enter x,y: 41 24<CR>
printf("x=%d y=%d\n",x,y);
x=41 y=24
}
x=24 y=41
8.5 函数之间地址值的传递
8.5.3 函数返回地址值
例8.5 程序举例。
p
i
a
#include <stdio.h>
int *fun(int *,int *); /*函数说明*/
x
a
320
y
b
printf("(4)x=%d y=%d\n",x,y);
}
调 用
传递
void swap(int *a,int *b)
{int t;
printf("(2)a=%d b=%d\n",*a,*b);
320 t
t=*a;*a=*b;*b=t;
t =x;x=y;y=t;
printf("(3)a=%d b=%d\n",*a,*b);
相关文档
最新文档