进阶指针笔试题

简介: 进阶指针笔试题

1.

int main()
{
  int a[5] = { 1,2,3,4,5 };
  int* ptr = (int*)(&a + 1);  //&a 拿到整个数组的地址 +1 跳过整个数组 然后强制类型转换成(int*)改变步长
  printf("%d %d", *(a + 1), *(ptr - 1));//a为首元素地址 +1为第二个元素地址2  ptr为数组后面的地址 -1得到5
  return 0; //       2           5
}

2.

struct Test
{
  int Num;
  char* pcName;
  short sDate;
  char cha[2];
  short sBa[4];
}*p;
//已知,结构体Test类型的变量大小是20个字节
//假设p的值为0x100000。如下表达式的值为多少?
int main()
{                          //本题考查的是指针+1到底加几个字节
  p = (struct Test*)0x100000;
  printf("%p\n", p + 0x1);   //p为结构体指针 大小为20个字节 所以+1跳过20个字节 0x100014     00100014
  printf("%p\n", (unsigned long)p + 0x1); //p强转成8字节的unsigned long型(不是指针) +1就单纯+1 0x100001被当做地址打印 00100001
  printf("%p\n", (unsigned int*)p + 0x1);//p强转成4字节(x86环境)的整形指针 +1跳过4个字节 0x100004  00100004
  return 0;
}

3.

int main()
{
  int a[4] = { 1,2,3,4 }; //一个字节一个地址 地址+1 跳过一个字节
  int* ptr1 = (int*)(&a + 1);   //跳过整个数组 强转int* 调整步长
  int* ptr2 = (int*)((int)a + 1);//把首元素地址强转成int类型+1 地址跳过一个字节  存入ptr2
  printf("%x,%x", ptr1[-1], *ptr2); // 如果是小端 01 00 00 00 02 00 00 00 跳过01 访问四个字节小端逆序得到02000000
  return 0;        //  4  02000000    
}

4.

#include<stdio.h>
int main()
{
  int a[3][2] = { (0,1),(2,3),(4,5) };//数组初始化应用{} 这个是逗号表达式 
  int* p;             //数组初始化为13 50 00
  p = a[0];           //p存放首行地址
  printf("%d", p[0]);//p[0]等价于 *(p+0) 为第一个元素 1 
  return 0;  //  1
}

5.

#include<stdio.h>
int main()
{
  int a[5][5];//5行5列的二维数组
  int(*p)[4];// 数组指针 指向4个int大小元素的数组
  p = a;    //&p[4][2]->*(*(p+4)+2)  p+1 跳过4个int +4 跳过16个int 
            //解引用向后访问4个int +2 在解引用 得到第三个元素->第19个元素
  printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);//&a[4][2]->第23个元素
  return 0;//低地址-高地址   FFFFFFFC              -4
}//  -4 的原码 10000000000000000000000000000100
 //       反码 11111111111111111111111111111011
//        补码 11111111111111111111111111111100
// 按地址打印   F   F   F   F   F   F   F   C

6.

#include<stdio.h>
int main()
{
  int aa[2][5] = { 1,2,3,4,5,6,7,8,9,10 };//二维数组
  int* ptr1 = (int*)(&aa + 1);  //跳过整个数组 强转int* 改变步长
  int* ptr2 = (int*)(*(aa + 1));//第一行+1 为第二行地址 解引用 为第二行首元素地址 改变步长
  printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));// 10      5
  return 0;  
}

7.

int main()
{
  char* a[] = { "work","at","alibaba" }; //指针数组a[0]存放w的地址 a[1]存放 a的地址 a[2]存放 a的地址 
  char** pa = a;  //a为首元素 a[0]的地址 存放在 二级指针pa中
  pa++;          //pa放的是 a[0]的地址 +1 指向a[1]的地址
  printf("%s\n", *pa); //解引用 为 at
  return 0;
}

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);        // POINT
  printf("%s\n", *-- * ++cpp + 3);//ER
  printf("%s\n", *cpp[-2] + 3);   //ST
  printf("%s\n", cpp[-1][-1] + 1);//EW
  return 0;
}


目录
相关文章
|
6月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
6月前
|
C语言
指针进阶(回调函数)(C语言)
指针进阶(回调函数)(C语言)
|
6月前
|
存储 C++
有关【指针运算】的经典笔试题
有关【指针运算】的经典笔试题
34 4
|
6月前
|
存储 C语言 C++
指针进阶(函数指针)(C语言)
指针进阶(函数指针)(C语言)
|
6月前
|
编译器 C语言
指针进阶(数组指针 )(C语言)
指针进阶(数组指针 )(C语言)
|
6月前
|
搜索推荐
指针进阶(2)
指针进阶(2)
50 4
|
6月前
指针进阶(3)
指针进阶(3)
43 1
|
6月前
|
C++
指针进阶(1)
指针进阶(1)
45 1
|
6月前
|
存储 安全 编译器
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
50 2
|
6月前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
49 0