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) 引用初始化以后不能被改变,指针能够改变所指的对象. ...
随机推荐
- 随机抽奖 --java
使用Math.random() 1.Math.random() 返回double类型. /** * 随机得到获奖名单 * @param assocs * @param prizeNumber * @r ...
- Oracle 差异增量和累计增量备份
网址: http://www.eygle.com/digest/2009/04/oracle_rman_incremental_backup.html 在rman增量备份中,有差异增量和累积增量的概念 ...
- mysql常用语句、命令(增删改查功能)
修改数据库的字符集 mysql>use mydb mysql>alter database mydb character set utf8;创建数据库指定数据库的字符集 ...
- DeepLearning之路(三)MLP
DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/articl ...
- mssql 修改文件逻辑名称
--查看文件逻辑名SELECT name FROM sys.database_files ALTER DATABASE [本身数据库名称]MODIFY FILE ( NAME = [原错误数据库名称] ...
- Spark随笔(三):straggler的产生原因
首先,介绍前辈研究的基于MapReduce框架的outlier产生原因:其次,根据这些方面来分析Spark架构中的straggler:最后,根据阅览的优化办法,谈谈自己的看法. 一.MapReduce ...
- Android中Service的使用
我个人的理解是:我们平时使用的android系统的app的后台应用,就是这个原理 可以利用Service实现程序在后台运行,依照这个原理,可以通过Service来实现关键代码的运行与实现. <一 ...
- (转)深入理解JavaScript 模块模式
深入理解JavaScript 模块模式 (原文)http://www.cnblogs.com/starweb/archive/2013/02/17/2914023.html 英文:http://www ...
- Python学习路程day8
Socket语法及相关 socket概念 A network socket is an endpoint of a connection across a computer network. Toda ...
- Unity3D 调用模态对话框/Unity3D MessageBox
Unity模态对话框/Unity MessageBox 很多时候,我们需要将Unity的exe产品发布到某一个平台.比如某某斗地主发布到某Q游戏.这时候如果需要调试肿么办.办法无外乎那几个.1:源码调 ...