Day08:C语言学习作业

用变量a给出下面的定义

a) 一个整型数:

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

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

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

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

int a;
int *p = &a;
int **q = &p;
int arr[10];
int *arr1[10];

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

A.变量 a 的地址值;

B.无意义;

C.变量 p 的地址值;

D.3

答案:D

分析:p是指向a的指针,是a的地址,*p是对取p的值,所以结果是3

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

A.int(*p)[7]

B.int *p[7]

C. (int *)p[7]

D. int *p[]

答案:A

分析:BC是创建一个指针数组,D不能成功定义

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

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

A. p = a;

B. q = *a;

C. q = a;

D. p = *a;

答案:D

分析:p是一级指针,所以应该是指向一维数组的,所以是对数组a取值

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

A. s1 = s2

B. s1 == s2

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

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

答案:D

分析:数组不能直接作比较,C是复制值

求 n 的值。n=______。

int a[20];

char *p1 = (char *)a;

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

int n = p2-p1;

答案:20

分析:a是整形,所以a+5中间有20个字节长度,而char只需要1个字节,所以p2-p1结果是20

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

A. p是指针数组

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

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

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

答案:D

分析: p是一个指针,指向一个含有三个数字的数组,*p[3]是一个数组里面是三个数组的指针,C语句错误,是一个指向数组元素的指针

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

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

答案:C

分析:先取值再++,a[1] = 20,++后为21

有以下程序段,执行后,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

分析:在循环中mul *= *(data+x)等于mul *= a[1 + x],结果为1*3*5*7 

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

int *a;

char *b;

char c[20];

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

 答案:4 4 20

分析:在32位计算机中,指针占4个字节,20位数据的数组char类型有20个字节

有以下定义:

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先取值,再++,所以已经是到a[2],B:先++再取值,结果是a[3],C:先加3,然后取值++,结果是a[3] +1,D:结果是a[2] + 1;

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

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

答案:C

分析:++只能用在变量上,不能用在数组上

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

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

答案:B

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

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

答案:D

分析:q是指针,a是变量

请写出输出结果 

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

分析: p-q是指p到q的距离,转换为int算的是字节长度

下面的程序输出的结果是__________ 

#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

分析:for循环里面是先取值,再自增,所以每次都是把值赋给自己了

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

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

答案:A

分析:B:取得是第一行第二列的值,C:越界了,D:越界了

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

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

答案:A 

下列哪个引用是不正确的?

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

分析:D只能取一次值 

下面程序的结果是多少? 

p1=(unsigned char *)0x801000;

p2=(unsigned long *)0x810000;

请问:

p1+5=

p2+5=

 答案:0x801005 0x810028

分析:p1是char类型所以+5就是+5,p2是long类型的,所以+5就是+40,因为0x是十六进制,所以结果是28;

请写出以下程序输出内容。

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, 0x2000000

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

int *p = (int*)0xff9527;
*p = 0x123;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值