C语言面试题
#include <stdio.h> int main()
{
int a[] = {, , , , };
int* p1 = (int*)(&a + ); // <==> (unsigned int)&a+sizeof(*&a) => 整个数组后面的那个地址
int* p2 = (int*)((int)a + ); <=> 取a[]后三个字节拼接a[]第一个字节 => 0x02000000
int* p3 = (int*)(a + ); <=> a[] printf("%d\n", p1[-]); // (unsigned int)p1-1*sizeof(*p1) => a[4]
printf("%d\n", p2[]); // 0x02000000
printf("%d\n", p3[]); // a[3] return ;
}
一条语句实现strlen
return (assert(s), (*s ? strlen(s+)+ : ));
#size_t为无符号整数 strlen的返回值为 size_t 类型
size_t strlen(const char* s)
{
size_t length = ;
aasert(s);//当指针为空时运行出错 assert.h while(*s++)
{
length++;
}
return }
strcpy实现
#include <stdio.h>
#include <assert.h> char* strcpy(char* dst, const char* src)
{
char* ret = dst; assert(dst && src); while( (*dst++ = *src++) != '\0' ); return ret;
} int main()
{
char dst[]; printf("%s\n", strcpy(dst, "Delphi Tang!")); return ;
}
重置动态空间的大小:
#include <stdio.h>
#include <malloc.h> int reset(char**p, int size, int new_size)
{
int ret = ;
int i = ;
int len = ;
char* pt = NULL;
char* tmp = NULL;
char* pp = *p; if( (p != NULL) && (new_size > ) )
{
pt = (char*)malloc(new_size); tmp = pt; len = (size < new_size) ? size : new_size; for(i=; i<len; i++)
{
*tmp++ = *pp++;
} free(*p);
*p = pt;
}
else
{
ret = ;
} return ret;
} int main()
{
char* p = (char*)malloc(); printf("%0X\n", p); if( reset(&p, , ) )
{
printf("%0X\n", p);
} return ;
}
一维方式打印二维数组:
#include <stdio.h>
#include <malloc.h> void printArray(int a[], int size)
{
int i = ; printf("printArray: %d\n", sizeof(a)); for(i=; i<size; i++)
{
printf("%d\n", a[i]);
}
} int main()
{
int a[][] = {{, , }, {, , }, {, , }};
int* p = &a[][]; printArray(p, ); return ;
}
指针方式打印二维数组:
#include <stdio.h> int main(int argc, char* argv[], char* env[])
{
int a[][] = {{, , }, {, , }, {, , }};
int i = ;
int j = ; for(i=; i<; i++)
{
for(j=; j<; j++)
{
printf("%d\n", *(*(a+i) + j));
}
}
}
#include <stdio.h> int main()
{
int a[][];
int(*p)[]; p = a; printf("%d\n", &p[][] - &a[][]); // -4
}
指针阅读技巧:
右左法则
1、从最里层的(最左)圆括号中未定义的标识符看起
2、先往右看,再往左看
3、当遇到圆括号或者(方括号时可以确定部分类型),并调转方向
4、重复 2,3 知道结束
#include <stdio.h> int main()
{
int (*p2)(int*, int (*f)(int*)); int (*p3[])(int*); int (*(*p4)[])(int*); int (*(*p5)(int*))[];
}
返回 int(*)[5] 数组指针类型
#include "stdio.h"
int test(int i)
{
return i;
} int (*test(int *p))[] //返回类型为 int(*)[5]
{
static int a[]={,,,,};
return &a;
} int main(int argc, char** argv, char* env[])
{ int (*(*p5)(int*))[];
int a = ;
//p5 = &a;
p5 = test; int(*p)[] = p5(&a); printf("%d \n", *(*p+));
printf("%d \n", *(*p+)); return ;
}
动态申请二维数组(没用一维数组指针实现,而是用的普通的int *指针)
int **malloc2d(int row, int col)
{
int** ret = (int**)malloc(sizeof(int*)*row);
int* p = (int*)malloc(sizeof(int)*row*col); int i = ;
if (ret && p)
{
for (i = ; i < row;i++)
{
ret[i] = (p + i*col);
}
}
else{
free(p);
free(ret);
} return ret;
} void free2d(int **a)
{
free(a[]);
free(a);
}
二维数组做参数
#include <stdio.h> void access(int a[][], int row)
{
//没必要传递列,可以计算出来,c语言中只有一维数组 int col = sizeof(*a) / sizeof(int);
int i = ;
int j = ; printf("sizeof(a) = %d\n", sizeof(a)); for(i=; i<row; i++)
{
for(j=; j<col; j++)
{
printf("%d\n", a[i][j]);
}
}
} int main()
{
int a[][] = {{, , }, {, , }, {, , }}; access(a, );
}
求n个数的平均值
#include <stdio.h>
#include <stdarg.h> float average(int n, ...)
{
va_list args;
int i = ;
float sum = ; va_start(args, n); for(i=; i<n; i++)
{
sum += va_arg(args, int);
} va_end(args); return sum / n;
} int main()
{
printf("%f\n", average(, , , , , ));
printf("%f\n", average(, , , , )); return ;
}
按字节进行清零
#include <stdio.h> #define RESET(p, len) while( len > 0) ((char*)p)[--len] = 0 void reset(void* p, int len)
{
while( len > )
{
((char*)p)[--len] = ;
}
} int main()
{
int array[] = {, , , , };
int len = sizeof(array); reset(array, len);
RESET(array, len); return ;
}
C语言面试题的更多相关文章
- C语言面试题汇总之一
C语言面试题汇总之一 1.static有什么用途?(请至少说明两种) l 限制变量的作用域: 设置变量的存储域. 2.引用和指针有什么区别? 引用必须被初始化,指针不必: 引用初始化以后不能被改变,指 ...
- 12个有趣的C语言面试题
摘要:12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出下面代码里的问题: #include<stdio.h> int ma ...
- c语言面试题之sizeof
c语言面试题之sizeof */--> c语言面试题之sizeof Table of Contents 1. sizeof 1 sizeof sizeof是c语言中判断数据类型或者表达式的长度符 ...
- C语言面试题(嵌入式开发方向,附答案及点评)
整理自C语言面试题(嵌入式开发方向,附答案及点评) 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SEC ...
- 转 C语言面试题大汇总
转 C语言面试题大汇总,个人觉得还是比较全地!!! \主 题: C语言面试题大汇总,个人觉得还是比较全地!!! 作 者: free131 (白日?做梦!) 信 誉 值: 100 ...
- 12个有趣的c语言面试题
1.gets()函数 问:请找出下面代码里的问题: #include int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets ...
- 嵌入式开发—C语言面试题
嵌入式开发—C语言面试题 源地址:http://blog.csdn.net/xdx2ct1314/article/details/7358929 1. 用预处理指令#define 声明一个常数,用 ...
- C语言面试题(一)
裸辞后,本周开始求职之旅.令人厌烦的是,大多数公司都会通知你去面试,然后拿出一纸试题,开始作答,最后笔试成绩作为重要的参考来决定是否录取你.对于大学四年挂了三年科的我,习惯遇到问题令辟溪径,从不 ...
- 华为C语言笔试题集合
①华为笔试题搜集 1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2) 在模块内(但在函数体外),一个被声明为 ...
- C语言面试题大汇总
static有什么用途?(请至少说明两种)1.限制变量的作用域2.设置变量的存储域7. 引用与指针有什么差别?1) 引用必须被初始化,指针不必.2) 引用初始化以后不能被改变,指针能够改变所指的对象. ...
随机推荐
- apache开启.htaccess
1 . 如何让的本地APACHE开启.htaccess 如何让的本地APACHE开启.htaccess呢?其实只要简朴修改一下apache的httpd.conf设置就让APACHE.htaccess了 ...
- Windows Store App 偏移特效
通过前面讲解的内容,读者已经了解了如何在三维空间中使旋转对象绕指定的旋转中心旋转一定的角度.接下来在这个基础上进一步讲解如何对旋转对象进行平移.下面首先介绍一下用到的几个属性. q LocalOff ...
- Java:多线程<二> 同步
由于多线程的访问出现延迟和线程的随机性,在使用多线程时往往会伴随安全性的问题,这些问题一旦出现将会是非常严重的.为了解决这种安全性问题,synchronized出现了. synchronized用法一 ...
- z-index、display、selector选择器优先级css优先级面试用到
z-index:控制元素叠放顺序,哪个z-index数值越大,那个优先被叠放在上面. relative.absolute.fixed这三种情况可以使用z-index. static不可以使用. dis ...
- windows下上传文件到VWware的centos
1.使用Xsell 连接到centos虚拟机,可以在虚拟机使用终端查看ip地址,命令:ifconfig -a 2.远程Linux系统上需要安装lrzsz工具包 Xsell命令:yum install ...
- 【转】Mybatis 3.1中 Mapper XML 文件 的学习详解
MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 ...
- MicroERP主要业务流程示意图
库存(进销存)管理 财务管理 固定资产管理 生产管理
- hdu 1041 (OO approach, private constructor to prevent instantiation, sprintf) 分类: hdoj 2015-06-17 15:57 25人阅读 评论(0) 收藏
a problem where OO seems more natural to me, implementing a utility class not instantiable. how to p ...
- androidd 程序默认安装位置和数据存储位置(公用和私用)
默认安装位置: android App 安装到外置SD卡中,缓解手机内置内存的压力: <manifest xmlns:android="http://schemas.android.c ...
- Android 绿豆蛙版连连看(简陋版)
(里面有六张绿豆蛙的图片) 1.选中会有红色框 2.可以直线连(横竖相邻或是横竖间隔空格) 3.可以拐一次弯连接 4.可以拐两次弯连接 5.连接时会有线显示 6.绿色代表进度条,蓝色代表时间条 imp ...