有关于指针的习题

1、先来思考一道题:(认真思考昂😶😶)

(单选题)有以下程序段:
main(){int a=5,*b,**c;c=&b;b=&a;…}
程序在执行了c=&b;b=&a;语句后,表达式**c的值是( )。
A)变量a的地址        B)变量b中的值       
C)变量a中的值        D)变量b的地址

 答案选:C

笔记:

二级指针c的内存单元里放的是一级指针b的地址,而b里面又放的是变量a的地址。
*c就等价于指针变量b,**c就等价于*b,而*b就是变量a,所以**c的值就是变量a的值!!!

2、这一道简单一点但还是看一下!

有以下程序变量b中的值

#include <stdio.h>

#include <string.h>

int main()

{

    char str[ ][20]= {"Hello","Beijing"},*p=str[0];

    printf("%d\n",strlen(p+20));

    return 0;

}

程序运行后的输出结果是_______

答案:7

笔记:

1.strlen(p+20)代表str[1]

2.strlen函数不计算反斜杠0

3、题目:

#include <stdio.h>

int main()

{  int p[7]= {11,13,14,15,16,17,18},i=0,k=0;

    while(i<7&&*(p+i)%2) {

      k=k+*(p+i);

        i++;  }

    printf("%d\n",k);

    return 0;

}

程序运行后的输出结果是___________

 答案:24

笔记:

1.*(p+i)%2结果为0时循环结束

所以只有前两个计入了k;

不要把循环理解成:(好吧,好像是羊自己)

    for(int i=0;i<7;i++)
    if(i<7&&*(p+i)%2)
    {
        k=k+*(p+i);
    }

 4、题目:

#include <stdio.h>

int main()

{  char a,b,c,*d;

    a='\';

    b='\xbc';

    c='\0xab';

    d="\0127";

    printf("%c %c %c %c \n",a,b,c,*d);

    return 0;}

编译时出现错误,以下叙述中正确的是_______

A、程序中只有a='\';语句不正确 

B、 b='\xbc';语句不正确 

C、d="\0127";语句不正确 

D、a='\';和 c='\0xab';语句都不正确

答案:D 

笔记:

1、因为单个\是转义字符,如果你要输入\的话,应该是a='\\'

2、d="\0127";反斜杠0代表结束,所以后边已经不能输入了

3、b='\xbc';因为\x代表16进制,所以\xbc代表一个16进制数字

 5、题目

#include<stdio.h>

int main()

{

    int x[8]={8,7,6,5}, *s;

    s=x+3;

    printf("%d\n",s[1]);

    return 0;

}

执行后输出结果是________

答案: 0

题解:

你看昂  这个数组   s是指针  然后s是x+3  x是数组名  那么也就是首地址   +3就是  x[3]的地址   所以也就是5的地址   然后输出是不是s1  也就是第二个  也就是说   从下标为3开始  数  0 1那么x4就是s1的地址   数组赋初值 是不是没有赋值的默认都为0  所以  答案为0

6、 题目

以下函数的功能是:通过键盘输入数据,为数组中的所有元素赋值。

#define N 10

void arrin(int x[N])

{

    int i=0;

    while(i<N)

        scanf("%d",_________);

}

在下划线处应填入的是_________

A、x+i

B、&x[i+1]

C、 x+(i++)

D、 &x[++i]

答案:C

题解:

A、x+i ,i一直没有变

B、&x[i+1] ,没有给x[0]赋值

D、 &x[++i] ,++i优先级较高先进行+1操作,所以没有给x[0]赋值

 6、题目:

int main()

{

    char  *s="\n123\\";

    printf("%d,%d\n",strlen(s),sizeof(s));

    return 0;

}

执行后输出结果是_________

答案: 5,8

笔记:

 每种类型的字节大小:

7、题目:

 若有定义int *p1,*p2; 则错误的表达式是(   )。  

A、p1+p2

B、p1-p2

C、p1<p2

D、p1=p2

答案:A

题解: 

A、p1+p2--语法错误

B、p1-p2 --指他们俩个中间的距离 

C、p1<p2--地址比较 

D、p1=p2--把p2的地址赋给p1

笔记:  

展开说一下上面的A选项昂:

两个指针是不能相加的。仍以街道地址的比喻为例,假设羊住在湖滨大道1332号,羊的邻居住在湖滨大道1364号,那么1332+1364指的是什么呢?其结果是一个毫无意义的数字。如果你的C程序试图将两个指针相加,编译程序就会发出警告。

8、一个很奇怪的题目

 有以下语句:      int a[5]={0,1,2,3,4},i;      int *p=a;  设0≤i<5,对a数组元素不正确的引用是(   )。 

A、*(&a[i]) 

B、a[p-a]

C、*(*(a+i)) 

D、p[i] 

答案:C

题解

A、*(&a[i]) ---a地址和取值号(*)抵消了

B、a[p-a]---p-a就是0,上一个题目才说的  指针可以剪  就是距离,p-a就是a-a,那就是0

C、*(*(a+i)) ---**是二级指针了

D、p[i] ---和A一样(师傅说的)

9、题目:

fun(char *sl,char *s2)

{

    int i=0;

    while(sl[i]==s2[i]&&s2[i]!='\0') i++;

    return(sl[i]=='\0'&&s2[i]=='\0');

}

此函数的功能是_________

  • A. 将s2所指字符串赋给s1
  • B. 比较s1和s2所指字符串的大小,若s1比s2的大,函数值为1,否则函数值为0
  • C. 比较s1和s2所指字符串是否相等,若相等,函数值为1,否则函数值为0
  • D. 比较s1和s2所指字符串的长度,若s1比s2的长,函数值为1,否则函数值为0

答案:C

题解:

 1、  while(sl[i]==s2[i]&&s2[i]!='\0') i++;此循环语句的意义是将s1与s2的每一个数组元素进行比较,直到s2中的元素比较完,循环结束;

2、 return(sl[i]=='\0'&&s2[i]=='\0');如果s1和s2的所有数组元素都相等,(即循环进行到了最后一项)表明他们相等,返回的函数值为1,否则函数值为0

 10、题目:

若有以下定义和语句:________

int s[4][5],(*ps)[5];

ps=s;

则对s数组元素的正确引用形式是

  • A.  ps+1
  • B. *(ps+3)
  • C. ps[0][2]
  • D. *(ps+1)+3

答案:C

笔记:

 1、指针类型(以int为例):
int* a;//a是指向整形的指针;
int* a[5];//一维指针数组(这里存放着5个指向整形的指针),a指向第一个元素的地址,a+1指向第二个......(a[5]是一个指针数组);

int (*a)[5];//指向数组(这里每个一维数组含5个元素)的指针,a是第一个一维数组的首元素地址,a+1指向第二个一维数组的首元素地址......(a是数组指针);
int (*a)();//a是指向函数的指针(函数指针);
int *a();//函数的返回类型是int *,a只是一个函数名;

2、int (*a)[5](int *p  和int a[] 这个是等价的,所以 int(*p)[]等价于 二维数组

该数组元素的正确引用形式:(以第一行第3个元素为例)

(1)ps[0][2]

(2)*(*(p+0)+2)

11、题目:

设int x[] ={1,2,3,4,5,6,7,8,9,10},*p=x; ,则值为3的表达式是______

  • A. p+=2, *p++
  • B. p+=2, *++p
  • C. p+=2, p++
  • D. p+=2, ++*p

答案:B

笔记:

考点是优先级;(可以去看羊转载的优先级图表文章)

12、题目

设有int a[ ]={0,1,2,3,4,5,6,7,8,9},*p=a;  ,且0≤i<10,则对数组元素地址的正确表示是( )

  • A. &(a+1)
  • B. a++
  • C. &p
  • D. &p[i]

 答案:D

题解:

  • A. &(a+1)--这个的话,直接报错了,不能这么写。如果是用a来表示元素的地址,是&a[1]才比较合理
  • B. a++--这个是自增嘛,更不对了的(他底层是把他作为一个常量地址,不能改变,所以就不能++了)
  • C. &p--&p相当于就是指向a的起点地址
  • D. &p[i]--&p[i]的话,等同于&a[i]
     

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值