当前位置:首页 > 第十章 指针
10.7 指针小结
10.7.1 指针基本概念与性质小结
1.指针是数据在内存中所占存储空间的首地址。存放指针值的变量称为指针变量,当指针变量的值为某变量的地址时,称这个指针变量指向该变量。同其他数据类型的变量一样,指针变量也必须在使用前加以定义。
2.指针变量的内容可以是0、NULL和一个确定的地址。其中0和NULL等价,它们表示空指针。除0外,其他任何常量都不允许直接赋值给指针变量。
3. C语言中用地址运算符(&)返回某变量的地址。地址运算符的操作数必须是一个内存变量,不能把地址运算符用于普通常量、表达式或寄存器类型的变量。
4.C语言用指针运算符(*,也称为间接引用运算符或复引用运算符)间接引用指针变量所指向数据的值。根据所指向的数据类型,间接引用时从指针变量存储的地址开始引用不同长度的数据。
5.指针常用于动态内存分配与管理,为提高在不同环境的可移植性,C语言提供了一个单目运算符sizeof返回某数据类型所占用的字节数。
6.如果调用函数要求被调用函数修改某些数据的值,应该把这些数据的地址作为实参传递给被调用函数的相应形参,被调用函数中的形参用指针运算符(*)间接修改调用函数中的相应实参的值。
7.数组名作为形参时,编译程序实际上使用指针变量进行处理。
8.使用指向函数的指针变量作为参数,可以在不改变调用函数的情况下根据需要调用不同的函数。
10.7.2 有关指针的数据类型的小结
指针可以指向不同数据类型的数据,包括单个变量、数组元素,甚至指针类型,也可以指向函数。多个相同类型的指针也可以构成指针数组。
定义 int i; int *p; int a[n]; int *p[n]; int (*p)[n]; int f(); int *p(); int (*p)(); int **p;
含 义 定义整型变量i 定义p为指向整型数据的指针变量 定义整型数组a,它有n个元素 定义指针数组p,它由n个指向整型数据的指针元素组成 定义p为指向含n个元素的一维数组的指针变量 f为返回整型值的函数 定义p为返回指针值的函数,该指针指向整型数据 定义p为指向整型函数的指针变量 定义二重指针变量p,它指向一个指向整型数据的指针变量 225
10.7.3 指针运算的小结
(1)指针变量加(减)一个整数
例如:p++、p--、p+i、p-i、p+=i、p-=i
指针变量加(减)常用于连续的存储区域中指针向前(后)移动指向的位置。 (2)指针变量赋值
将一个对象的首地址赋给一个指针变量。 p=&a; /* 将变量a的地址赋给p */ p=array; /* 将数组array的首地址赋给p */ p=&array[i]; /* 将数组array第i个元素的地址赋给p */ p=max; /* max为已定义的函数,将max的入口地址赋给p */ p1=p2; /* p1和p2是同类型的指针变量,将p2的值赋给p1 */
(3)两个指针变量相减
如果两个指针变量指向同一个数组的元素,则两个指针变量值之差是两个指针之间的元素个数。
(4)两个指针变量比较
如果两个指针变量指向同一个数组的元素,则两个指针变量可以进行比较。指向前面的元素的指针变量“小于” 指向后面的元素的指针变量。
指针之间也可以与NULL进行比较。一般地,对于刚刚定义还没有和某个地址相结合的一个指针,某些系统给它的初值为NULL(用户也可以给定初值NULL)。通过该比较,我们可以知道该指针是否指向了内存中的某个地址。
习 题
一.填空题
1. 指针变量是把内存中另一个数据的 作为其值的变量。 2. 能够直接赋值给指针变量的整数是 。 3. 如果程序中已有定义:int k;
1) 定义一个指向变量k的指针变量p的语句是 。 2) 通过指针变量,将数值6赋值给k的语句是 。
3) 定义一个可以指向指针变量p的变量pp的语句是 。 4) 通过赋值语句将pp指向指针变量p的语句是 。
5) 通过指向指针的变量pp,将k的值增加一倍的语句是 。
4. 当定义某函数时,有一个形参被说明成int *类型,那么可以与之结合的实参类型可以
是 、 等。 5. 以下程序的功能是:将无符号八进制数字构成的字符串转换为十进制整数。例如,输入的
226
字符串为:556,则输出十进制整数366。请填空。 #include
{
char *p,s[6];
int n; p=s; gets(p); n=*p-'0';
while( != '\\0') n=n*8+*p-'0'; printf(\ }
二.选择题
1. 若有定义:int i,j=7,*p=&i; 则与i=j;等价的语句是 。
A) i=*p; B) *p=*&j; C) i=&j; D) i=**p; 2. 设int *p,i;以下正确的语句是 。
A) *p=10; B) i=p; C) p=&i; D) p=2*p+1; 3. 设char *s;以下正确的语句是 。
A) s=“C Language”; B) *s=“C Language”; C) **s=“C Language”; D) *s=‘C’;
4. 设有语句:int a[10]={0,1,2,3,4,5,6,7,8,9}, *p=a;以下对数组a中的数组元素的不正确引用是: 。
A) a[p-a] B) *(&a[i]) C) p[i] D) *(&(a+i)) 5. 设有定义:int (*ptr)[M];其中ptr是 。
A) M个指向整型变量的指针;
B) 指向M个整型变量的函数指针;
C) 一个指向具有M个整型元素的一维数组的指针变量;
D) 具有M个指针元素的一维指针数组,每个元素都只能指向整型量。 6. 下列程序的运行结果是 。
#include
int k;
char *s=“a\\n35\\b”; for(k=0;*s++;k++) printf(“k=%d\\n”,k); }
A) k=5 B) k=6 C) k=7 D) k=8
227
7. 下列程序的运行结果是 。
#include
void func(int *a,int b[]) {
b[0]=*a+6; } main() {
int a,b[5]; a=0; b[0]=3;
func(&a,b);
printf(“%d\\n”, b[0]); }
A) 6 B) 7 C) 8 D) 9
8. 设已有定义: char *st=\下列程序段中正确的是 。
A) char a[11], *p; strcpy(p=a+1,st[4]); B) char a[11]; strcpy(++a,st); C) char a[11]; strcpy(a,st);
D) char a[], *p; strcpy(p=&a[1],st+2);
9. 假定下列程序的可执行文件名为prg.exe,则在该程序所在的子目录下输入命令行: prg hello good↙后,程序的输出结果是 。
main(int argc,char *argv[]) {
int i;
if(argc<=1) return; for(i=1;i printf(\ } A) hello good B) hg C) hel D) hellogood 10. 有如下程序段: int *p,a=10,b=1; p=&a; a=*p+b; 执行该程序段后,a的值为 。 A) 12 B) 11 C) 10 D) 编译出错 11. 对于基类型相同的两个指针变量之间,不能进行的运算是 。 A) < B) = C) + D) – 228
共分享92篇相关文档