9-9 C语言指针作业

1.用变量a给出下面的定义:

a) 一个整型数: 

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

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

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

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

答案:a):int a;

b):int *p=&a;

c):int **q;

d): int a[10];

e):int (*p)[10];

2.在 int a = 3, int *p = &a;中,*p 的值是( ) 

A:变量 a 的地址值;

B:无意义;

C:变量 p 的地址值;

D:3;

答案:D。

解析://p=&a;*p=3。

3.下列定义中,( )是定义了一个指向数组的指针p。

A:int(*p)[7]//正确定义了一个指向包含7个整数的数组的指针 p。每个指针都可以指向一个整数。

B:int *p[7]//这定义了一个包含7个指针的数组 p。

C. (int *)p[7]//定义错误,非法表达式。

D. int *p[]//与B类似,

答:A。

4.有以下说明语句,则正确的赋值语句是()。

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

A. p = a;

B. q = *a;

C. q = a;

D. p = *a;

答:D。

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

A. s1 = s2

B. s1 == s2

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

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

答案: D。

解析:A这是一个赋值语句。

B:这是判断地址是否相等。

C:这是复制语句。

D:正确。

6.求 n 的值。n=__。

int a[20];

char *p1 = (char *)a;

char *p2 = (char *)(a+5);

int n = p2-p1;

答案:20。

解析:a 是 int 类型数组,因此 a+5 表示指向数组中第 5 个 int 元素的指针。将 a+5 转换为 char*,那么 p2 和 p1 之间的差值表示它们之间的字节数。a+5 指向第 5 个整型元素,而每个 int 类型在大多数系统中占 4 个字节。因此,从 p1 到 p2 的字节差为:5 * sizeof(int) = 5 * 4 = 20 个字节。

7.若有说明int(*p)[3],以下叙述正确的是( )

A. p是指针数组

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

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

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

答案:D。

解析:p实质上是一个指向数组的指针。它指向一个包含3个int元素的一维数组。*p[3] 表示 `p` 是一个指针数组,其中每个元素都是 int*,*p[3]访问指针数组中第 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]。再*++p解值=30。

9.有以下程序段,执行后,mul的值为( ) 

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

int mul, *data, x;

mul=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。

第一次循环 (x = 0):
*(data + 0) 等于 *data,即 a[1] 的值 3。

mul = mul * 3 = 1 * 3 = 3。

第二次循环 (x = 1):
*(data + 1) 等于 a[2] 的值 5。

mul = mul * 5 = 3 * 5 = 15。

第三次循环 (x = 2):
*(data + 2) 等于 a[3] 的值 7。

mul = mul * 7 = 15 * 7 = 105。

10.在32位计算机系统上,以下代码的输出结果是什么?

int *a;

char *b;

char c[20];

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

答案:4,4,20。

解析:在32位操作系统上指针的大小通常为4个字节,所以a,b为4,C是求数组包含20个元素的字符串的总字节,大小为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。

解析:p+=2,即将a[0]的地址+2为a[2],*++p,a先右移再解值结果为a[3]为4,*(p++)先解值再右移结果为a[2]为3正确。D为先解值运算加一等于3+1=4。

12.若已定义:int a[6], *p = a, 不能表示 a[1] 地址的表达式是:

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

答案:C。

解析:A:p + 1 会使指针从a[0]向a[1]移动一个位置。

B表示数组的起始地&a[0]。a+1是数组名加上一个元素的偏移量,所以a + 1指向a[1]的地址。

C:a是数组名,不能对数组名进行自增操作。

D:++p会使p指针自增一个位置,因此++p指向a[1]的地址。

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

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

答案:B。

解析:*p=x,p=&x;

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

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

答案:D。

解析:指针不能指向常量,d错误。

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-p是指针差值,表示 q 和 p 之间的元素个数。

(int)q-(int)p是计算结果是地址值之差,通常int类型是4个字节,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指向的值,然后p自增(从a[0]向后偏移)。a[0]=0,a[1]=2,a[2]=4...

17.数组声明为:short a[3][4],引用第3行第1列的元素写作________。

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

答案:a。

解析:A:展开为*(*(a+2)+0)即为a[2][0]。B:展开为*(*(a+0)+2)即为a[0][2]。CD越界。

18.指针变量p1和p2类型相同,要使p1,p2指向同一个变量,正确的是________。

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

答案:A。

解析:&和*互反,即A正确。

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。

解析:*(a+i)=a[i],这已经是一个数值了,*(*(a+i))再对数值求解,是不合法的。

20.下面程序的结果是多少? 

p1=(unsigned char *)0x801000;

p2=(unsigned long *)0x810000;

请问:

p1+5=

p2+5=

答案:0x801005,0x810028。

解析:char类型一个字节1*5=5,long类型占8个字节5*8=40。

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);

}

答案:0x4,0x02000000。

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

答案:int *p=int (*)0xff9527;

*p=0x123;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值