指针笔试题

指针笔试题

    • 笔试题目一
    • 笔试题目二
    • 笔试题目三
    • 笔试题目四
    • 笔试题目五
    • 笔试题目六

笔试题目一

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

题目分析
1首先a代表的是数组首元素的地址 加上一就是代表的2的地址
对其解引用就可以得到2这个元素
2 而ptr拿到的是整个数组的地址再加一 所以指向五后面一个元素
而随后又被强转成int类型的指针了 所以移动的范围变成了一个元素
所以说 最后向前移动一位 变成指向元素5
所以说 最终的结果是2 5

指针笔试题_第1张图片

笔试题目二

struct Test
{
 int Num;
 char *pcName;
 short sDate;
 char cha[2];
 short sBa[4];
}*p = (struct Test*)0x100000;

int main()
{
 printf("%p\n", p + 0x1);
 p是一个指针 指针的大小是20 所以这个时候应该是加上20 变成0x100014
 printf("%p\n", (unsigned long)p + 0x1);
 这里是变成一个整型 实际上加上的数字就是1 所以应该变成0x100001
 printf("%p\n", (unsigned int*)p + 0x1);
 这里变成一个int类型的指针 所以应该变成 0x100004
 return 0;
}

我们首先要明确 0x1是一个十六进制数字1

答案如下

指针笔试题_第2张图片

笔试题目三

int main()
{
    int a[4] = { 1, 2, 3, 4 };
    int *ptr1 = (int *)(&a + 1);
    首先取地址a是取出整个数组的地址 加上1之后指针指向4
    所以说指向4后面一个元素  所以说ptrl{-1}应该是指向4
    int *ptr2 = (int *)((int)a + 1);
    下面这个我们就要画图来解释了
    printf( "%x,%x", ptr1[-1], *ptr2);
    return 0;
}

要求上面代码输出的结果

指针笔试题_第3张图片
这个时候指针指向的00 我们读取一下这个数据的内存
答案应该是02 00 00 00

笔试题目四

要求以下程序的输出结果

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

这个其实是一个逗号表达式 里面真正的内容应该是 1 3 5 0 0 0
输出的结果应该是第一行首元素 应该是1

笔试题目五

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));
    这里首先aa是首元素地址 再二维数组中就是第一行的地址 加上1之后变成
    printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
    return 0;
}

所以说 输出的结果是十 五
指针笔试题_第4张图片

笔试题目六

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

这里首先a是一个指针数组

里面的每一个元素其实都是一个指针

用pa来接受a这个数组的首元素地址 其实也就是work的地址

pa++之后 指向at 这个指针

所以说打印出来的结果是at

以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够

不吝赐教 在评论区或者私信指正 博主一定及时修正

那么大家下期再见咯

你可能感兴趣的:(配套作业,c语言知识,算法,数据结构,c++)