6章
指针
3.与指针有关的各种定义和意义
int *p; p 为指向整型量的指针变量。
int *p[n]; p 为指针数组,由 n 个指向整型量的指针元素组成。
int (*p)[n]; p 为指向整型二维数组的指针变量,二维数组的列数为 n。
int *p() p 为返回指针值的函数,该指针指向整型量。
int (*p)() p 为指向函数的指针,该函数返回整型量。
int **p p 为一个指向另一指针的指针变量,该指针指向一个整型量。
4.有关指针的定义
有关指针的定义很多是由指针,数组,函数定义组合而成的。但并不是可以任意组合,例如 数组不能由函数组成,即数组元素不能是一个函数;函数也不能返回一个数组或返回另一个函 数。例如:
int a[5]();
就是错误的。
5.关于括号
在解释组合定义符时,标识符右边的方括号和圆括号优先于标识符左边的“*”号,而方括 号和圆括号以相同的优先级从左到右结合,但可以用圆括号改变约定的结合顺序。
6.阅读组合定义符的规则是“从里向外”
从标识符开始,先看它右边有无方括号或园括号,如有则先作出解释,再看左边有无*号。
如果在任何时候遇到了闭括号,则在继续之前必须用相同的规则处理括号内的内容。例如:
int *(*(*a)())[10]
按照由内向外的阅读顺序,下面来分析它:
(1)*a 标识符 a 被说明为一个指针变量;
(2)(*a)()指向一个函数;
(3)*(*a)()返回一个指针;
(4)*(*a)()[10]该指针指向一个有 10 个元素的数组;
(5)*(*(*a)())[10]其类型为指针型;
(6)int *(*(*a)())[10]指向 int 型数据。
因此 a 是一个函数指针变量,该函数返回的一个指针值又指向一个指针数组,该指针数组的 元素指向整型量。
习题六
一、选择题
【习题 6-1】变量的指针,其含义是指该变量的( )。
A.值 B.地址 C.名 D.一个标志
【习题 6-2】若有语句 int *point,a;,则 point=&a;中运算符&的含义是( )。
A.位与运算 B.逻辑与运算 C.取指针内容 D.取地址
【习题 6-3】若 x 是整型变量,pb 是整型的指针变量,则正确的赋值表达式是( )。
A.pb=&x B.pb=x; C.*pb=&x; D.*pb=*x
【习题 6-4】下面程序段的运行结果是( )。
206
C语
言 程 序 设 计
char *s="abcde";
s+=2;
printf("%d",s);
A.cde B.字符'c'
C.字符'c'的地址 D.无确定的输出结果
【习题 6-5】设 p1 和 p2 是指向同一个字符串的指针变量,c 为字符变量,则以下不能正确执行的赋值 语句是( )。
A.c=*p1+*p2; B.p2=c C.p1=p2 D.c=*p1*(*p2);
【习题 6-6】若有定义语句:
char a[]="It is mine";
char *p="It is mine";
则以下不正确的叙述是( )。
A.a+1 表示的是字符 t 的地址
B.p 指向另外的字符串时,字符串的长度不受限制 C.p 变量中存放的地址值可以改变
D.a 中只能存放 10 个字符
【习题 6-7】若有定义:int a[2][3],则对 a 数组的第 i 行 j 列元素地址的正确引用为( )。
A.*(a[i]+j) B.(a+i) C.*(a+j) D.a[i]+j
【习题 6-8】 设有如下定义:
int (*ptr)();
则以下叙述中正确的是( )。
A.ptr 是指向一维组数的指针变量 B.ptr 是指向 int 型数据的指针变量
C.ptr 是指向函数的指针,该函数返回一个 int 型数据
D.ptr 是一个函数名,该函数的返回值是指向 int 型数据的指针
【习题 6-9】设有定义 int (*ptr)[m];
其中的标识符 ptr 是( )。
A.m 个指向整型变量的指针 B.指向 m 个整型变量的函数指针
C.一个指向具有 m 个整型元素的一维数组的指针
D.具有 m 个指针元素的一维指针数组,每个元素都只能指向整型量
【习题 6-10】若要用下面的程序片段使指针变量 p 指向一个存储整型变量的动态存储单元:
int *p;
p=__________ malloc( sizeof(int));
则应填入( )。
A.int B.int * C.(*int) D.(int *) 二、阅读下列程序,填空或给出程序运行结果
【习题 6-11】以下程序的功能是:通过指针操作,找出三个整数中的最小值并输出。
#include "stdio.h"
main() {
int *a,*b,*c,num,x,y,z;
第
#include "stdio.h"
#include "string.h"
main() #include "stdio.h"
main()
{ int a[M],i,j,t;
for(i=0;i<M;i++) scanf("%d",a+i);
i=0;j=M-1;
while(i<j) {
t=*(a+i);
*(a+i)= _______;
*(______)=t;
i++; j--;
}
for(i=0;i<M;i++
printf("%3d",*(a+i));
}
【习题 6-14】给出程序运行结果。
#include "stdio.h"
void f(int *x,int *y);
main() {
int a[8]={1,2,3,4,5,6,7,8},i,*p,*q;
p=a;q=&a[7];
208
#include "stdio.h"
void prt(int *m,int n);
main() {
int a[]={1,2,3,4,5},i;
prt(a,5);
for(i=0;i<5;i++) printf("%d,",a[i]);
void prt(int *m,int n)
#include "stdio.h"
#include "string.h"
void fun(char *w,int n);
#include "stdio.h"
main() {
char a[]="programming",b[]="language";
char *p1,*p2;
第
6章
指针
的字符串。如:"rotor"。
【习题 6-22】编制一个字符替换函数,实现已知字符串 str 中,所有属于 ch 中的字符都用 ch2 中对应 字符代替。函数原型:
void replace(char *str, char ch, char ch2)
【习题 6-23】编写一个函数,删除一个字符串的指定字符,函数原型:
int delStr(char *str, char ch)
先判断字符是否出现在字符串中,如果未出现,则返回 0,如果字符出现一次或多次,则返回字符的 个数。
【习题 6-24】编写函数把参数字符串中的字符反序排列, 函数原型:
void reversestr(char * str)
使用指针,不要使用数组下标,也不要声明局部数组来临时存储。