指针经典笔试面试题

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


写出下列程序的结果。

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


相关文章
|
5月前
|
存储 C语言 C++
C语言------------指针笔试题目深度剖析
C语言------------指针笔试题目深度剖析
43 1
|
5月前
|
C++
C/C++工程师面试题(指针篇)
C/C++工程师面试题(指针篇)
92 0
|
5月前
|
算法 程序员 索引
【Leetcode 程序员面试金典 02.08】 —— 环路检测 |双指针
我们可以使用双指针解决本题,由数学推导可知:a 的距离为(环长度的倍数 - b),即 tmp 指针从头节点走到环开头节点等于 slow 指针走到环开头节点的距离
|
13天前
|
编译器 C语言
经典左旋,指针面试题
文章介绍了两种C语言实现字符串左旋的方法,以及如何使用C语言对整数数组进行奇偶数排序。通过实例演示了如何使用函数reverse_part和leftRound,以及在swap_arr中实现数组元素的重新排列。
24 0
|
19天前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
5月前
指针和数组笔试题目解析
指针和数组笔试题目解析
28 0
|
5月前
|
Java Go
Golang深入浅出之-Go语言指针面试必知:理解与使用指针
【4月更文挑战第21天】Go语言中的指针允许直接操作内存,常用于高效数据共享和传递。本文介绍了指针的基础知识,如声明、初始化和解引用,以及作为函数参数使用。此外,讨论了`new()`与`make()`的区别和内存逃逸分析。在结构体上下文中,指针用于减少复制开销和直接修改对象。理解指针与内存管理、结构体的关系及常见易错点,对于面试和编写高性能Go代码至关重要。
78 2
|
5月前
|
编解码 缓存 安全
【C/C++ 泡沫精选面试题03】谈谈C/C++ 智能指针?
【C/C++ 泡沫精选面试题03】谈谈C/C++ 智能指针?
80 1
|
5月前
|
存储 C语言
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
|
5月前
|
安全 IDE Java
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
78 1