【进阶C语言】指针笔试题(详解)(一)

简介: 【进阶C语言】指针笔试题(详解)(一)

笔试题1


int main()
{
  int a[5] = { 1, 2, 3, 4, 5 };
  int* ptr = (int*)(&a + 1);
  printf("%d,%d", *(a + 1), *(ptr - 1));
  return 0;
}
//程序的结果是什么?


代码结果:

图片讲解:


笔试题2


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


代码结果:

详细讲解:

struct Test
{
  int Num;
  char* pcName;
  short sDate;
  char cha[2];
  short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
  p = (struct Test*)0x100000;
  printf("%p\n", p + 0x1);
  printf("%p\n", (unsigned long)p + 0x1);//这里指的是整型加1
  printf("%p\n", (unsigned int*)p + 0x1);//这里指的是指针加1
  return 0;
}


图片讲解:


笔试题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;
}


代码结果:


详细讲解:


a为首元素地址,假设a的地址是0x0012ff40,(int)a强制类型转换为整型,整型加1,变成0x0012ff41


图片讲解:


a为首元素地址,假设a的地址是0x0012ff40,(int)a强制类型转换为整型,整型加1,变成0x0012ff41



笔试题4


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


代码结果:

详细讲解:

int main()
{
  int a[3][2] = { (0, 1), (2, 3), (4, 5) };//该为逗号表达式
  //int a[3][2] = { {0, 1}, {2, 3}, {4, 5} };//这才是真正数组的情况
  int* p;
  p = a[0];
  printf("%d", p[0]);
  //a[0]是二维数组第一行的数组名
  //对a[0]这个数组名没有&,没有单独sizeof
  //所有a[0]这个数组名表示数组首元素的地址,即a[0][0]的地址
  //a[0]----->&a[0][0]
  //p[0]----->*(p+0)--*p
  return 0;
}


a[ 0 ]是二维数组第一行的数组名

对a[ 0 ]这个数组名没有&,没有单独sizeof

所有a[ 0 ]这个数组名表示数组首元素的地址,即a[ 0 ][ 0 ]的地址

a [ 0 ]----->&a[ 0 ][ 0 ]

p[ 0 ]----->*(p+0)–*p


图片讲解:

相关文章
|
1天前
|
C语言
c语言指针总结
c语言指针总结
15 1
|
1天前
|
C语言
C语言(指针详解)重点笔记:指针易错点,都是精华
C语言(指针详解)重点笔记:指针易错点,都是精华
3 0
|
1天前
|
存储 C语言
C语言指针讲解(适用于初学者)
C语言指针讲解(适用于初学者)
6 0
|
1天前
|
搜索推荐 C语言
详解指针进阶2
详解指针进阶2
|
1天前
|
存储 程序员 C语言
【C 言专栏】C 语言指针的深度解析
【4月更文挑战第30天】C 语言中的指针是程序设计的关键,它如同一把钥匙,提供直接内存操作的途径。指针是存储其他变量地址的变量,通过声明如`int *ptr`来使用。它们在动态内存分配、函数参数传递及数组操作中发挥重要作用。然而,误用指针可能导致错误,如空指针引用和内存泄漏。理解指针的运算、与数组和函数的关系,以及在结构体中的应用,是成为熟练 C 语言程序员的必经之路。虽然挑战重重,但掌握指针将增强编程效率和灵活性。不断实践和学习,我们将驾驭指针,探索更广阔的编程世界。
|
1天前
|
存储 C语言
C语言进阶---------作业复习
C语言进阶---------作业复习
|
1天前
|
存储 Linux C语言
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)-2
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)
|
1天前
|
自然语言处理 Linux 编译器
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)-1
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)
|
1天前
|
存储 编译器 C语言
C语言进阶第十课 --------文件的操作-1
C语言进阶第十课 --------文件的操作