• 沒有找到結果。

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)

使用指针,不要使用数组下标,也不要声明局部数组来临时存储。

相關文件