C语言指针相关习题

1.设有定义:int x=0,*p;
紧接着的赋值语句正确的是(B)

A.*p=NULL;B.p=NULL; C.p=x; D.*p=x;

解析:题目中定义指针变量p,指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误。不允许把一个数赋予指针变量,被赋值的指针变量前不能再加”*说明符,因此B选项正确。

2.下列说法正确的是(C)

A)如果p是指针变量,则&p是不合法的表达式
B)如果p是指针变量,则p表示变量p的地址值
C)在对指针进行加、减算术运算时,数字1表示1个存储单元的长度
D)如果p是指针变量,则*p+1和*(p+1)的效果是一样的

【解析】B选项中,如果p是指针变量,则*p表示变量p所指向的地址的值;A选项中,如果p是指针变量,则&p表示变量p的地址;D选项中,如果p是指针变量,*p+1表示将p所指的值加上1,而*(p+1)表示的是先将指针右移一位再取所指向变量的值。因此C选项正确。

 

3.设有如下的说明和定义

struct{
    int a;char*s;
}x,*p=&x;x.a=4;x.s="hello";则以下叙述中正确的是(C)

A)(p++)->a与p++->a都是合语法的表达式,但二者不等价
B)语句++p->a:的效果是使p增1
C)语句++p->a;的效果是使成员a增1
D)语句*p->s++;等价于(p)->s++;

【解析】本题考查结构体变量的引用,++p->a的效果是使成员a增1,*p->s++为字符e,与(*p)->s++不等价。

因为取结构体成员操作符->的优先级大于指针运算符*,所以 *p->s就是*(p->s),s是char *,那么*(char *)结果是一个char,也就是结构变量x的成员字符串s的第一个字符。 而(*p)->s是语法错误,p是一个指向结构x的指针,*p就是x,是一个结构型变量,不能用->操作符。所以p++->a不合法。

4.若有以下程序

#include<stdio.h>
int k=7,m=5;
void f(int **s) {
	int *t=&k;
	s=&t;
	*s=&m;
	printf("%d,%d,%d,",k,*t,**s);
}
main() {
	int i=3,*p=&i,**r=&p;
	f(r);
	printf("%d%d%d\n",i,*p,**r);
}

则程序输出的 结果是多少?

解析:首先我们来都f()函数里面的代码

int *t=&k; t是一个变量,复制它的值是k的地址,*t就是k

s=&t; s是一个变量,它的值是t的地址,*s就是t

*s=&m; *s就是t,也就是把m的地址的值赋给t,那么t的值就变成了m的地址

printf("%d,%d,%d,",k,*t,**s);结果是7,5,5

再来看main()函数里面的代码

r的值传递给s,r和s是分别的2个变量,*r=*s=p,

但是f里面重新修改了s,那么变成了*s=t,没有改动过p,因此r没有变,p也没有变。

printf("%d%d%d\n",i,*p,**r);结果是3,3,3

【小结】

面对指针操作的时候,先撇开其度类型上的区别,比如问上边的s和t,他们本质都是一个变量,然后答记录了一个值,你只需要记录当s=&t时,*s就是t,然后一步步推理,就能分析清楚所有的指针操作,久而久之,熟能生巧。

至于类型上,记住一个关系:s=&t,那么s就该比t多一个*号,如t是int *t,那么s就是int **s

 

 

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值