指针经典笔试面试题

简介: 指针经典笔试面试题


写出下列程序的结果。

1.

#include<stdio.h>
int main ()
{
  int a[5] = { 1,2,3,4,5 };
  int* par = (int*)(&a + 1);
  printf("%d %d", *(a + 1), *(par - 1));
}

结果:

解析:

(1)int *  par  =  (int*)  (&a + 1) —— &a,取出整个数组的地址,再 + 1 ,跳过20个字节(整个数组),然后将其强制转换为整型类型,存入整型指针par中,par 指向数组的后面。

(2)* (a+1) —— a是数组名,代表首元素地址,+1,跳过4个字节,即a+1相当于&a[1],所以打印结果为2。

(3)* ( par-1 ) —— par指向数组a后面的地址,par是整型指针,- 1,指针往后移4个字节,所以指针指向的是a[4]的地址,所以打印结果为5。

2.

#include<stdio.h>
struct test
{
  int num;
  char* name;
  short date;
  char ch[10];
}*p;//结构体大小为20
int main()
{
  p = (struct test*)0x00100000;
  printf("%p\n",p+0x1);
  printf("%p\n", (struct test*)((unsigned long)p+0x1));
  printf("%p\n", (unsigned int*)p + 0x1);
}

结果:

解析:

(1)p =  ( struct  test * ) 0x00100000 ,p是一个结构体指针 ,0x100000是一串十六进制数,通过类型强制转换,将它变为结构体类型的地址,存在指针p中。

(2)题中出现的0x1,是十六进制数,等于十进制数1。

(3)printf (" %p\n " , p + 0x1 ) ——  p + 0x1就等于p+1 ,p是结构体类型指针,+ 1 ,指针后移20个字节,地址是用十六进制表示,所以相当于地址加0x14,故打印结果为 0x00100014。

(4)printf (" %p\n ", ( struct test* ) ( ( unsigned long ) p + 0x1 ) ) ——  ( unsigned long ) p,将p转换为无符号长整形数 100000,+ 1,变成100001,再将其转换结构体类型的指针,所以打印结果为00100001。

(5)printf(" %p\n " , ( unsigned int * ) p + 0x1 ) —— ( unsigned int * ) p,将p转换为无符号整型指针,+ 1 ,指针后移4个字节,所以打印结果为00100004。

3.

#include<stdio.h>
int main()
{
  int a[4] = { 1,2,3,4 };
  int* par1 = (int*)(&a + 1);
  int* par2 = (int*)((int)a + 1);
  printf("%x %x", par1[-1],*par2);
}

结果:

解析:

1,2题中与这道题重复考点不再讲解。

这个结果是在vs上的编译结果,采用的是小端存储模式。

小端存储模式:数据的高位保存在高地址处。

比如1的储存:

这道题中:

*par的打印结果位2000000


相关文章
|
4月前
|
存储 C语言 C++
C语言------------指针笔试题目深度剖析
C语言------------指针笔试题目深度剖析
38 1
|
4月前
|
C++
C/C++工程师面试题(指针篇)
C/C++工程师面试题(指针篇)
81 0
|
4月前
|
算法 程序员 索引
【Leetcode 程序员面试金典 02.08】 —— 环路检测 |双指针
我们可以使用双指针解决本题,由数学推导可知:a 的距离为(环长度的倍数 - b),即 tmp 指针从头节点走到环开头节点等于 slow 指针走到环开头节点的距离
|
4月前
指针和数组笔试题目解析
指针和数组笔试题目解析
27 0
|
4月前
|
编解码 缓存 安全
【C/C++ 泡沫精选面试题03】谈谈C/C++ 智能指针?
【C/C++ 泡沫精选面试题03】谈谈C/C++ 智能指针?
66 1
|
4月前
|
存储 C语言
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
|
4月前
|
安全 IDE Java
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
68 1
|
4月前
|
C++
面试题:常量指针和指针常量?
面试题:常量指针和指针常量?
37 0
|
4月前
|
C++
面试题:如何避免野指针?
面试题:如何避免野指针?
43 0
|
11天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。