C进阶(2)指针进阶(5)

目录

10、指针笔试题

1.第一题

2.第二题

3、第三题

4、第四题

5、第五题

6、第六题

7、第七题

8、第八题


10、指针笔试题

1.第一题

int main()
{
    int a[5]={1,2,3,4,5};
    int *ptr=(int *)(&arr+1);
    printf("%d %d",*(a+1),*(ptr-1));
    return 0;
}

解释:

&a是代表整个数组的地址,&a的类型是int(*)[5],&a+1跳过一个数组的大小。

C进阶(2)指针进阶(5)_第1张图片

2.第二题

struct Test
{
    int Num;
    char *pcName;
    short sDate;
    char cha[2];
    short SBa[4];
}*p;
//假设p的值为0x100000,如下表达式的值分别为多少?
//这个结构体20个字节
int main()
{
    printf("%p\n",p+0x1);
    printf("%p\n",(unsigned long)p+0x1);
    printf("%p\n",(unsigned long *)p+0x1);
    return 0;
}

解释:

(1)p+0x1:一个结构体指针+1跳过一个结构体。

0x100000+20

 =0x100014

(2)(unsigned long)p+0x1:整型+1

0x100001

(3)(unsigned long*)p+0x1:指针+1,跳过一个unsigned long*类型的大小就是4个字节

0x100004

3、第三题

int main()
{
    int a[4]={1,2,3,4};
    int *ptr1=(int *)(&a+1);
    int *ptr2=(int *)((int)a+1);
    printf("%x,%x",ptr1[-1],*ptr2);

    return 0;
}

解释:

ptr1:(&a+1)跳过一个数组的大小

ptr2:(int)a+1,强制类型转换成int,变成了整数+1

C进阶(2)指针进阶(5)_第2张图片

ptr1[-1]:相当于*(ptr1-1);

因此答案为4     2000000

4、第四题

int main()
{
    int a[3][2]={(0,1),(2,3),(4,5)};
    int *p;
    p=a[0];
    printf("%d",p[0]);
    return 0;
}

 解释:

逗号表达式:从左向右依次计算

C进阶(2)指针进阶(5)_第3张图片

a[0]代表二维数组第一行的地址

p是二维数组第一行的地址

p[0]就是第一行第一个的元素的值

因此答案为1

5、第五题

int main()
{
    int a[5][5];
    int (*p)[4];
    p=a;
    printf("%p,%d\n",&p[4][2]-&a[4][2],&p[4][2]-&a[4][2]);
    return 0;
}

 C进阶(2)指针进阶(5)_第4张图片

 答案:FFFFFFFC -4

第一个打印的是补码。

6、第六题

int main()
{
    int aa[2][5]={1,2,3,4,5,6,7,8,9,10};
    int *ptr1=(int *)(&aa+1);
    int *ptr2=(int *)(*(aa+1));
    printf("%d %d",*(ptr1-1),*(ptr2-1));
    return 0;
}

解释:

C进阶(2)指针进阶(5)_第5张图片

&aa+1跳过一个数组,*(aa+1)是跳过一行。

因此答案是 10,5

7、第七题

int main()
{
    char *a[]={"work","at","alibaba"};
    char **pa=a;
    pa++;
    printf("%s\n",*pa);
    return 0;
}

 C进阶(2)指针进阶(5)_第6张图片

 因此答案是at

8、第八题

int main()
{
    char *c[]={"ENTER","NEW","POINT","FIRST"};
    char **cp[]={c+3,c+2,c+1,c};
    char ***cpp=cp;
    printf("%s\n",**++cpp);
    printf("%s\n",*--*++cpp+3);
    printf("%s\n",*cpp[-2]+3);
    printf("%s\n",cpp[-1][-1]+1);
    return 0;
}

解释:

C进阶(2)指针进阶(5)_第7张图片

(1) **++cpp:
C进阶(2)指针进阶(5)_第8张图片

 因此第一个打印的是POINT

(2)*--*++cpp+3

由于第一个printf函数中,cpp发生了改变,因此cpp指向cp的第二个也就是上面图像中箭头所指的部分。

C进阶(2)指针进阶(5)_第9张图片

图从左向右读,因此答案是ER

(3)*cp[-2]+3

C进阶(2)指针进阶(5)_第10张图片

答案是ST

(4)cpp[-1][-1]+1

C进阶(2)指针进阶(5)_第11张图片

答案是EW

cpp[-1][-1]--->*(*(cpp-1)-1) 

你可能感兴趣的:(#,C学习,c++)