电话:13485538018
关闭
您当前的位置:首页 > 职场资讯 > 面试秘籍

C语言面试宝典:毕业生必刷的指针与内存题

来源:网络整理 时间:2026-07-05 作者:佚名 浏览量:

面临毕业就遭遇失业状况, 不清楚当下这句话还行不行得通, 反正我们毕业那个时候, 这句话是流行的, 这也着实让人心里慌慌的。

言归正传,毕业季,为大家分享一些关于C语言的面试题。

1用变量 a 给出下面的定义

a.一个有10个指针的数组,该指针是指向一个整型数的;

b.一个指向有10个整型数数组的指针;

c.有一个指针, 它指向这样一个函数, 这个函数有一个整型的参数, 并且会返回一个整型的数。

d.一个数组, 它有10个指针, 这些指针指向一个函数, 此函数具有一个整型类型的参数, 并且会返回一个整型的数。

答案:

int * a[10];int (*a)[10]                                 int (*a)(int);int (*a[10])(int);

2写一段代码计算结构体、联合、位段、内存大小

答案:

struct A{  int a;  char b;  float c;  struct A d;  double e;};
sizeof(A)

3代码改错

下面代码涉及到动态内存开辟,请改正下面错误代码:

wap( int* p1,int* p2 ){  int * p;  *p = *p1;  *p1 = *p2;  *p2 = *p;}

答案是, p 属于野指针, 它是那种指向一个已被删除对象的指针, 或者是指向一个未申请访问受限内存区域的指针。

void swap(int *pa, int *pb){  int tmp;  tmp = *pa;  *pa = *pb;  *pb = tmp;}

4数组和链表的区别?

数组:数据顺序存储,固定大小;

链表:数据可以随机存储,大小可动态改变;

5要对绝对地址0x100000赋值

要对绝对地址0x100000赋值,我们可以用:

(unsigned int*)0x100000 = 1234;

要是想让程序去到绝对地址为0x100000的地方去执行, 那么应当如何去做呢?

答案:

*((void?(*)(?))0x100000)();
(void (*)())0x100000 //首先要将0x100000强制转换成函数指针
*((void (*)())0x100000)(); //然后再调用它:

6const 有什么用途?

答案:

1.可以定义 const 常量;

2.可以用const修饰函数的参数, 也可以修饰函数的返回值, 甚至还能修饰函数的定义体。那些被const修饰的东西, 全都受到强制保护, 能够预防意外的变动, 具备提升程序健壮性的作用。

(void *)ptr 所占用的 7 个空间位置, 和 (*(void **))ptr 这样的方式所获取到的结果, 二者能不能是一样的情况呢?

其中ptr为同一个指针。

答案:

他们的值相同。

c语言面试宝典_结构体联合位段内存大小计算_C语言面试题

尝试使用#define来声明一个常量, 以此来明确1年之中所包含的秒数(暂且不考虑闰年相关的问题), 这样做是否可行呢。

答案:

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

要点:

A.没有以分号结束;

B.明白预处理器会替你对常数表达式的值进行计算, 也就是60乘以60乘以24乘以365, 而非315360该, , 00。

C.考虑到了16位机将会溢出,巧妙运用了UL。

创造一个被称作“标准”的宏MIN, 它用于在输入两个参数之后, 进行并返回其中较小的那一个, 对吗。

答案:

#define MIN(A,B) ((A) <= (B) ? (A) : (B))

要点:

A.参数用括号括起来;

B.考察能否合理运用条件运算符;

10

Heap与Stack的差别?

答案:Heap是堆,Stack是栈。

堆的空间是程序在运行时由系统去做自动分配以及释放操作的, 而栈上的空间则是要通过手动方式来进行分配以及释放的。

栈空间存在着有限的情况, 堆指的是相当大的那种自由存储区域, 通过malloc函数所分配的内存空间是在堆上面的。

网上经典例子:

int a = 0; //全局初始化区 char *p1;//全局未初始化区 void main(void){  int b; //栈   char s[] = "abc"; //栈   char *p2; //栈   char *p3 = "123456"; //123456在常量区,p3在栈上  static int c =0; //全局(静态)初始化区   p1 = (char *)malloc(10); //堆   p2 = (char *)malloc(20); //堆 }

11

下面的声明都是什么意思?

代码:

const int a;int const a;const int *a;int * const a;int const * a const;

答案:

A.前两个的作用是一样,a是一个常整型数;

B.一个指向常整型数的指针, 它意味着a, 也就是, 整型数不能被修改, 可是指针能够做到, 这是第三个所表达的意思。

C.第四个意思, a是一个指针, 它指向整型数, 且这个指针是常指针, 这意味着, 指针指向的整型数能够被修改, 然而指针自身不能够被修改。

D.最末那一个所表示的是,a这是一个指向常量整型数的常量指针, 也即是说, 指针所指向的那个整形数是不能够被修改的, 与此同时, 指针本身也是不可以被修改的。

12

sizeof和strlen的区别?

答案是, sizeof属于运算符, 它是在编译的时候就已经计算好了的;然而strlen却是函数,它需要在运行的时候才能够进行计算。

编排?|?strongerHuang

微信公众号 |?嵌入式专栏

微信扫一扫分享资讯
相关推荐
暂无相关推荐
客服服务热线
13485538018
24小时服务
微信公众号
手机浏览

CopyrightC 2009-2025 All Rights Reserved 版权所有 芜湖人才网 本站内容仅供参考,不承担因使用信息、外部链接或服务中断导致的任何直接或间接责任,风险自担。如有侵权,请联系删除,联系邮箱:ysznh@foxmail.com 鄂ICP备2025097818号-15

地址: EMAIL:qlwl@foxmail.com

Powered by PHPYun.

用微信扫一扫