linux 操作 day 9(指针)

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

a) 一个整型数:

答案:int a;(定义一个整型变量a)

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

答案:int *a;(定义一个整型指针变量a)

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

答案:int **a;   (定义一个整型指针的指针变量a)

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

答案:int a[10]; (定义一个整型数值a)

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

答案:int (*a)[10]; (定义一个数组指针变量a)

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

  • A.变量 a 的地址值;
  • B.无意义;
  • C.变量 p 的地址值;
  • D.3

分析:*p==3

         

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

  • A.int(*p)[7]     //数组指针
  • B.int *p[7]      //这是一个数组,包含7个指向整型的指针,而不是指向数组的指针。
  • C. (int *)p[7]           //这表示对 p 数组中第8个元素的强制类型转换,p 本身并没有被定义为指向数组的指针。
  • D. int *p[]   //指向整型指针的数组

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

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

  • A. p = a;     //p为指针,只能储存内存地址,a为数组,不能直接赋值给指针p;
  • B. q = *a;     //**q为二级指针,储存数据为地址,*a为数组的值,不能赋给指向指针的指针变量;
  • C. q = a;     //**q为二级指针,储存数据为地址,a为数组,不能赋值给指针,
  • D. p = *a;     //因为*a是a[0]即首行,类型为 int[5],而 p 可以指向这个数组的首地址,类型匹配。

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

  • A. s1 = s2        //赋值运算不能用来做判断使用;
  • B. s1 == s2     //两个字符串的地址不相同,且不能比较地址来判断相应地址的字符串是否相同
  • C. strcpy(s1, s2) == 0;     //strcpy拷贝不能做判断;
  • D. strcmp(s1, s2) == 0;   //注:strcmp会解引用指针,来比较其内容
  • 分析:s1和s2分别指向的是两个字符串,所以s1和s2所储存的地址不相等,即B选项错误。
    •            strcmp,可以用来比较字符串大小,
  • 6、求 n 的值。n=______。

int a[20];

char *p1 = (char *)a;        //将a[0]地址储存在p1中

char *p2 = (char *)(a+5);   //将a[5]储存在p2中

int n = p2-p1;              n等于a[5]与a[0]之间的int类型字节长度,即4*5=20

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

  • A. p是指针数组     //数组指针
  • B. (*p)[3]和 *p[3]等价    //(*p)[3]为数组指针,*p[3]为一个指向指针的数组,只储存地址,即指针数组
  • C. p是指向一维数组中任何一个元素的指针   //p指针指向含有3个整形元素的一维数组的指针
  • D. p是指向含有3个整形元素的一维数组的指针
  • 8、设数组a[5]=(10,20,30,40,50],已知指针p指向a[1],则表达式*++p的值是 ( ) 

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

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

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);//1、3     2、15    3、15*7   4、15*7

}

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

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

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

int *a;

char *b;

char c[20];

printf("%d, %d, %d", sizeof(a),  sizeof(b), sizeof(c));   // @ 4  @1    @20

答案: 4   1    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

//3                                                //4

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

//4                                                //4

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

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

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

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

分析:p=&x    *p=x    p=*&x

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

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

分析:q储存p的地址,且q为指针。

                故D错,a为整型变量,不能储存在只能存储地址的指针变量q中。

15、请写出输出结果

int main()

{

    int a[10] = {0};

    int *p = a;              //p储存a[0]的地址

    int *q = &a[6];        //q储存a[6]的地址

    printf("%d\n", q-p);  //int类型在32位计算机中为4byte,故q-p==24byte

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

}

16、请写出输出结果 

int main()

{

    int a[10] = {0};

    int *p = a;         //p储存a[0]的地址

    int *q = &n[6];   //q储存a[6]的地址

    printf("%d\n", q-p);  //int类型在32位计算机中为4byte,故q-p==24byte

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

#include <stdio.h>

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

main()

{

    int i;

    int *p = a;                  //p储存a[0]的地址

    for(i = 0; i < 4; i++)

        a[i] = *p++;             //a[0]==0    p==;  a[1]==2     

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

}

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

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

分析:第三行第一列:a[2][0]     *  *(a+2)

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

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

分析:*p1==*p2

                即要满足储存的地址相同

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

21、下面程序的结果是多少?

p1=(unsigned char *)0x801000;     //1byte

p2=(unsigned long *)0x810000;     //4byte

请问:

p1+5=0x801005

p2+5=0x810014

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

void main()

{

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

    int *p1 = (int *)(&a +1);     //地址加一跳一个类型变量,即跳16字节

    int *p2 = (int *)((char *)a + 1);   //p2储存a[1]的地址

    printf("0x%x, 0x%x", *(p1-1), *p2);    //(p1-1)跳一个int类型的byte,即跳4字节,返回到变量a中,且地址位置在a[3]上,故解引后得4;    0x4,0x0

}

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
	int *p=0xff9527;
	*p=0x123;
	printf("0x%x 0x%x",p,*p);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值