C基础作业7

1、用变量a给出下面的定义(3C科技、宇视科技,神思电子,中安云科,北京凝思软件)

a) 一个整型数:

    int a

b) 一个指向整型数的指针:

    int *p=a

c) 一个指向指针的的指针,它指向的指针是指向一个整型数:

     int **p=a

d) 一个有10个整型数的数组:

     int a[10]

e) 一个指向有 10个整型数数组的指针:

int a[10]

int *p=&a

2、在 int a = 3, int *p = &a;中,*p 的值是( ) (华辰泰尔)

        A.变量 a 的地址值;

        B.无意义;

        C.变量 p 的地址值;

        D.3

答:D

解析:p=&a,*p=a

3、下列定义中,( )是定义了一个指向数组的指针p。(矩阵软件)

      A.int(*p)[7]

      B.int *p[7]

      C.(int *)p[7]

      D. int *p[]

答:A

解析:B选项 int *p[7] 中,运算符[ ]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组。C选项是强制类型转换,D选项定义错误。

4、有以下说明语句,则正确的赋值语句是()。(山大华天)

int a[5][5]; int *p, **q;

      A. p = a;

      B. q = *a;

      C. q = a;

      D. p = *a;

答:D

解析:A选项p=&a, B选项不对,C选项编译没问题,但是不同维数的指针互相赋值,容易出错。

5、设 char *s1, *s2; 分别指向两个字符串,可以判断字符串 s1 和 s2 是否相等的表达式为( ) (山大华天)

A. s1 = s2

B. s1 == s2

C. strcpy(s1, s2) == 0;

D. strcmp(s1, s2) == 0;

答:A

解析:选项s1=s2是把s2赋值给s1;B选项是s1和s2的首地址相同;C选项是把s2复制给s1。

6、求 n 的值。n=______。(山东丁一)

int a[20];

char *p1 = (char *)a; 强制类型转换,p1=a的首地址

char *p2 = (char *)(a+5); 强制类型转换,p2=a的首地址移动5位

int n = p2-p1;

答:5

解析:所以n=5

7、若有说明int(*p)[3],以下叙述正确的是( ) (杭州快越科技)

A. p是指针数组

B. (*p)[3]和 *p[3]等价

C. p是指向一维数组中任何一个元素的指针

D. p是指向含有3个整形元素的一维数组的指针

答:D

解析:(*p)[3] 数组指针,p是一个指针,指向1个有3个变量的数组,*p[3]指针数组,p是一个有3个元素的数组,每个元素的类型是整形指针

8、设数组a[5]=(10,20,30,40,50],已知指针p指向a[1],则表达式*++p的值是 ( ) (杭州快越科技)

A. 31              B. 30                C. 21             D. 20

答:B

解析:*++p,先进行**p,然后再解值。结果为a[2]=30

9、有以下程序段,执行后,mul的值为( ) (杭州快越科技)

int a[] = {1, 3, 5, 7, 9};

int nul, *data, x;

nul=1;

data=&a[1];

for(x=0; x<3; x++)

{

mul *= *(data+x);

}

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

A. 945         B. 315          C. 105          D. 15

答;C

解析:

int a[] = {1, 3, 5, 7, 9};     //定义一个整型数组

int nul, *data, x;

nul=1;

data=&a[1];                     //data指向a[1]的地址

for(x=0; x<3; x++)           //for循环

{

mul *= *(data+x);            //*(data+x),x为0,1,2;(data+x)分别指向a[1],a[2],a[3]的地址,所                                            以mul=3*5*9=105

}

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

10、在32位计算机系统上,以下代码的输出结果是什么?(泰华智慧)

int *a;

char *b;

char c[20];

printf("%d, %d, %d", sizeof(a), sizeof(b), sizeof(c));

答:4 4 20

解析:指针变量字节大小在32为计算机上是4字节大小,所以sizeof(a)=sizeof(b)=4,sizeof(c)=20

11、有以下定义:(华三外协,紫光云数,山东信通电子,新华三,石峰)

int a[]={1, 2, 3, 4, 5, 6, 7, 8 ,9 ,10}, *p = a

下列哪个表达式的值为3:( )

A. p += 2, *(p++)               B. p += 2, *++p

C. p += 3, *p++                 D. p += 2, ++*p

答:A

解析:

A. p += 2使p指向a[2], *(p++)表示先取*p的值, 然后p增加1(指向a[3]), 所以取得的值是a[2]=3            B. p += 2使p指向a[2], *++p表示先p增加1(指向a[3]),然后取*p的值,所以是a[3]=4
C. p += 3使p指向a[3], *p++表示先取*p的值, 然后p增加1(指向a[4]), 所以取得的值是a[3]=4
D. p += 2使p指向a[2], ++*p对*p的值增加1, 所以取得的值是a[2]=a[2]+1=4

12、若已定义:int a[6], *p = a, 不能表示 a[1] 地址的表达式是:(云尖软件开发,紫光云数,智洋创新,新华三,石峰)

A. p+1            B. a+1             C. a++              D. ++p

答:C

解析:*p=a,p=&a;a++是先指向a[0]的地址再+i

13、有定义: int x, *p;能使指针变量P指向变量x的语句是:________ (智洋)

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

答:B

解析:A选项*p是对指针取值,&x是对x取地址;C选项x为整型变量,D选项p为指针,*&x=x。

14、若有说明int a=2, *p=&a, *q=p;则以下非法的赋值语句是( )。 (智洋)

A. p=q            B. *p=*q               C. a=*q              D. q=a

 答:D选项a为整型变量,q为整型指针,不能把变量赋值给指针。

15、请写出输出结果 (晟安信息)

int main()

{

int a[10] = {0};

int *p = a;

int *q = &n[6];

printf("%d\n", q-p);

printf("%d\n", (int)q - (int)p);

}

答:6 24

解析:q指向a[6]地址,p指向a[0]地址,q-p=6;(int)q为字节,4*6=24。

16、下面的程序输出的结果是__________ (飞音时代)

#include <stdio.h>

int a[] = {0, 2, 4, 6, 8};

main()

{

int i;

int *p = a;

for(i = 0; i < 4; i++) a[i] = *p++;

printf("%d\n", a[2]);

}

答:4

解析:*p++,先取指针p指向的值(数组第一个元素1),再将指针p自增1;

            a[2]=4

17、数组声明为:short a[3][4],引用第3行第1列的元素写作________。(富士安全)

    a. **(a+2)             b. *(*a+2)              c. a[3][1]               d. *(a[3]+1)

答:AC

解析:**(a+2)表示第三行的首元素;*(*a+2)表示第一行第二列的元素;*(a[3]+1)指向地址。

18、指针变量p1和p2类型相同,要使p1,p2指向同一个变量,正确的是________。(富士安全)

a. p2=*&p1          b. p2=**p1         c. p2=&p1        d. p2=*p1

答:c

解析:a选项将p1指向的值赋值给p2,

19、下列哪个引用是不正确的? (中维世纪)

int a[10]={0. 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p=a;

A. a[p-a];              B. *(&a)                  C. p;                D. *(*(a+i));

答:D

解析:p=a,a[p-a]=a[0];*(&a)=a[0];D选项a+i指向地址,*(a+i)为常量,*常量是错误的。

20、下面程序的结果是多少? (中科四平)

p1=(unsigned char *)0x801000;

p2=(unsigned long *)0x810000;

请问:

p1+5=

p2+5=

答:0x801005

       0x801005

解析:

p1指向字符型,一次移动1个字节;p1+5后移5个字节,16进制表示为5。
p2指向长整型,一次移动4个字节,p2+5后移20字节,16进制表示为14。

21、请写出以下程序输出内容。(小端环境) (信雅达)

void main()

{

int a[4] = {1, 2, 3, 4};

int *p1 = (int *)(&a +1);

int *p2 = (int *)((char *)a + 1);

printf("0x%x, 0x%x", *(p1-1), *p2);

}

答:4  ?

22、用 C 语言编程,向内存0xff9527地址上存入一个整型数0x123

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值