c语言指针练习

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

        a) 一个整型数:

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

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

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

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

a)int a;

b)int *a;

c)int **a;

d)int a[10];

e)int (*a)[10];

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

        A.变量 a 的地址值;

        B.无意义;

        C.变量 p 的地址值;

        D.3

D

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

        A.int(*p)[7]

        B.int *p[7]

        C. (int *)p[7]

        D. int *p[]

B

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

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

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

分析:

        int a[5][5];        //定义二维数组a,5行5列

        int *p, **q;        //定义一级指针*p和二级指针**p;

        A. p=a;        //错误赋值

        B. q=*a;        //

        C. q=a;        //错误赋值,q=&p

        D. p=*a        //错误赋值,p       

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

A. s1 = s2        B. s1 == s2

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

D

分析:

A. s1 = s2,赋值运算不能判断字符串 s1 和 s2 是否相等。

B. s1 == s2,char *s1, *s2; 分别指向两个字符串,字符串不能直接比较大小。

C. strcpy(s1, s2) == 0; strcpy的作用是拷贝字符串,不能比较大小。

D. strcmp(s1, s2) == 0;strcmp的作用是比较两个字符串的大小,==0说明s1等于s2。

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

        int a[20];

        char *p1 = (char *)a;

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

        int n = p2-p1;

20

分析:

        int a[20];        //定义长度20的整型数组,int一位4字节

        char *p1 = (char *)a;        //定义字符指针p1,对a强转,char一位1字节

        char *p2 = (char *)(a+5);        //定义字符指针p2,对(a+5)强转

        int n = p2-p1;        //a的首地址(a[0])与移动5位(a[5])的差是20==4*5

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

A. p是指针数组

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

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

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

D

分析:

int(*p)[3]的数据类型是:int[];p是数据名,所以int(*p)[3]是数组指针,排除A。*p[3]是指针数组,排除B。int(*p)[3]中p指向的是含有3个整形元素的一维数组的指针,所以排除C,选D。

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

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

B

分析:

已知指针p指向a[1],说明p现在指向的值是20。表达式*++p,p先自加,即p指向a[2],然后再取值,即p指向的值是30;所以*++p的值是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++)

{

    nul *= *(data+x);

}

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

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

C

分析:

int a[] = {1, 3, 5, 7, 9};        //定义长度为5的整型数组

int nul, *data, x;                //定义变量nul和x;指针*data

nul=1;                                //初始化nul=1

data=&a[1];                        //初始化指针data=&a[1],即*data==a[1]==3

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

{

    nul *= *(data+x);                //nul = nul 乘以 *(data+x) 

}

printf("%d\n", nul);                //经过3次循环后输出nul==105

xnuldata+xnul *= *(data+x)
0133
13515
2157105

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

int *a;

char *b;

char c[20];

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

4        4        20

分析:

int *a;                //定义整型指针a

char *b;                //定义字符指针b

char c[20];                //定义长度为20字符数组

printf("%d, %d, %d", sizeof(a),  sizeof(b), sizeof(c));        //输出a,b,c的字节大小

在32位计算机系统上,指针的字节大小一直是4字节,char是字符类型,一个字符占用1字节,存了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

分析:

int a[]={1, 2, 3, 4, 5, 6, 7, 8 ,9 ,10}, *p = a;        //定义长度10的整型数组a,指针p指向数组a的首地址,即a[0]==p[0]

表达式的值为3:即a[3]==3

 A. p += 2, *(p++);        p=p+2,先*p,再p++;所以*(p++)=*p[2]=3;

B. p += 2, *++p;        *++p,p先移动一位,即*p[3]=4

C. p += 3, *p++;        p=p+3,所以*(p++)=*p[3]=4;先*p,再p++;

D. p += 2, ++*p        p=p+2,所以++*p先*p=3,再自加,即++*p=4。

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

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

C

分析:

int a[6], *p = a;       

定义长度6的整型数组a,指针p指向数组a,即指向数组a的首地址,即p=&a[0]

p+1和a+1,因为p=a;所以p+1=a+1;都表示数组下标+1,即p[1]和a[1]。

因为a是数组名,是一个常量地址,所以a++表达方式是错误的,p是指针名,是一个变量,++p表示p自加1,即p[1]==a[1]。

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

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

B

分析 :

在C语言中,指针变量用于存储变量的地址,以便通过该地址访问变量的值。为了使指针变量指向某个变量,需要将该变量的地址赋值给指针变量。p是整型指针变量,x是整型变量,p指向a时需要使用&。

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

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

ABCD

分析:

int a=2, *p=&a, *q=p;

        // p=&a; *p=a=2; q=&p; **q=a

所以A. p=q错,B. *p=*q错,C. a=*q错,D. q=a错

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

     return 0;

}

6        24

分析:

int main()

{

    int a[10] = {0};        //定义长度10的整型数组a,并初始化

    int *p = a;                //指针p指向a[0]

    int *q = &a[6];          //指针q指向a[6]

    printf("%d\n", q-p);        //q-p=6,输出为6

    printf("%d\n", (int)q - (int)p);        //强转,int是4字节,所以输出为24

    return 0;

}

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

#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

分析:

#include <stdio.h>

int a[] = {0, 2, 4, 6, 8};        //定义长度5的整型数组

main()

{

    int i;

    int *p = a;        //指针p指向一维数组a,p[0]=a[0]=0

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

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

}

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

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

a

分析:

a.**(a+2)表示第三行第一列的元素 

b. *(*a+2)表示第一行第三列的元素

c. a[3][1] 和 d. *(a[3]+1),a[3]越界了,直接排除

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

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

a

分析:

a. p2=*&p1,*和&互为逆运算,所以p1=p2

b. p2=**p1,

c. p2=&p1,

d. p2=*p1,

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

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. a[p-a];  p=a;所以a[p-a]=a[0],正确

B. *(&a)  ,*和&互为逆运算,所以*(&a)=a,正确

C. p;正确

D. *(*(a+i));未定义i,错误。

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

p1=(unsigned char *)0x801000;

p2=(unsigned long *)0x810000;

请问:

p1+5=

p2+5=

0x801005        32位计算机0x810014 / 64位计算机0x810028

分析:

p1p2 是两个指针变量,它们分别指向了内存地址 0x8010000x810000p1的类型是unsigned char *,p2的类型是unsigned long *。

p1+5,因为 p1 的类型是 unsigned char *,在进行指针加法运算时,会按照 unsigned char 的大小来进行增加。unsigned char 通常占用1个字节,因此 p1+5 将会指向 0x801000 地址向后偏移5个字节的位置,即 0x801005

p2+5,情况稍有不同。由于 p2 的类型是unsigned long *,unsigned long的大小取决于编译器和平台,通常是4个字节(在32位系统中)或8个字节(在64位系统中)。这里没有给出具体的平台信息,因此我们无法确定确切的地址偏移量。但如果假设是在32位系统中,p2+5 将会指向 0x810000 地址向后偏移 5 * sizeof(unsigned long) 个字节的位置。如果 sizeof(unsigned long) 是4个字节,则 p2+5 将会指向 0x810000 + 5 * 4 = 0x810014。如果是64位系统,那么 sizeof(unsigned long) 通常是8个字节,p2+5 将会指向 0x810000 + 5 * 8 = 0x810028

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

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

分析:

 int a[4] = {1, 2, 3, 4};        //定义长度4的整型数组a并初始化

    int *p1 = (int *)(&a +1);        //对数组a取址后加1,再强转

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

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

23、用 C 语言编程,向内存0xff9527地址上存入一个整型数0x123 (宇视科技)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值