2022年应聘C语言类工作职位面试题大汇总 .pdf
说明 data 为 bs 变量,共占两个字节。其中位域a 占 8位,位域 b 占 2 位,位域c 占 6 位。对于位域的定义尚有以下几点说明:1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时, 应从下一单元起存放该位域。 也可以有意使某位域从下一单元开始。例如:struct bs unsigned a:4 unsigned :0 /*空域*/ unsigned b:4 /*从下一单元开始存放 */ unsigned c:4 在这个位域定义中, a 占第一字节的 4 位,后 4 位填 0 表示不使用, b 从第二字节开始,占用4 位,c 占用 4 位。2. 由于位域不允许跨两个字节, 因此位域的长度不能大于一个字节的长度,也就是说不能超过8 位二进位。3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:struct k int a:1 int :2 /*该 2 位不能使用 */ int b:3 int c:2 ; 从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 二进位分配的。二、位域的使用位域的使用和结构成员的使用相同,其一般形式为:位域变量名 ?位域名 位域允许用各种格式输出。main() struct bs unsigned a:1; unsigned b:3; unsigned c:4; bit,*pbit; bit.a=1; bit.b=7; bit.c=15; pri 改错:#include int main(void) int *p; int arr100; p = &arr; return 0; 解答:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - 搞错了 , 是指针类型不同 , int *p; /二级指针&arr; /得到的是指向第一维为100 的数组的指针#include int main(void) int *p, *q; int arr100; q = arr; p = &q; return 0; 下面这个程序执行后会有什么错误或者效果: #define MAX 255 int main() unsigned char AMAX,i;/i被定义为 unsigned char for (i=0;i=MAX;i+) Ai=i; 解答:死循环加数组越界访问(C/C+不进行数组越界检查 ) MAX=255 数组 A的下标范围为 :0.MAX-1, 这是其一 . 其二. 当 i 循环到 255 时, 循环内执行 : 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - A255=255; 这句本身没有问题 . 但是返回 for (i=0;i= MAX) MAX = 2 * MAX; b = (int*)realloc(a,MAX * sizeof(int); if(b = NULL) printf(error3); exit(-1); a = b; for(;-j = 0;) fprintf(fp2,%dn,aj); fclose(fp1); fclose(fp2); return 0; 第二题 . #include int main(void) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - - - - - - - unsigned long int i,j,k; printf(please input the numbern); scanf(%d,&i); if( i % 2 = 0) j = i / 2; else j = i / 2 + 1; printf(The result is n); for(k = 0; k j; k+) printf(%d = %d + %dn,i,k,i - k); return 0; #include void main() unsigned long int a,i=1; scanf(%d,&a); if(a%2=0) for(i=1;i printf(%d,a,a-i); else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - for(i=1;i=a/2;i+) printf( %d, %d,i,a-i); 兄弟, 这样的题目若是做不出来实在是有些不应该, 给你一个递规反向输出字符串的例子 , 可谓是反序的经典例程 . void inverse(char *p) if( *p = = 0 ) return; inverse( p+1 ); printf( %c, *p ); int main(int argc, char *argv) inverse(abc0); return 0; 借签了楼上的“递规反向输出”#include void test(FILE *fread, FILE *fwrite) char buf1024 = 0; if (!fgets(buf, sizeof(buf), fread) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - return; test( fread, fwrite ); fputs(buf, fwrite); int main(int argc, char *argv) FILE *fr = NULL; FILE *fw = NULL; fr = fopen(data, rb); fw = fopen(dataout, wb); test(fr, fw); fclose(fr); fclose(fw); return 0; 在对齐为 4 的情况下struct BBB long num; char *name; short int data; char ha; short ba5; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - *p; p=0 x1000000; p+0 x200=_; (Ulong)p+0 x200=_; (char*)p+0 x200=_; 希望各位达人给出答案和原因,谢谢拉解答:假设在 32 位 CPU上,sizeof(long) = 4 bytes sizeof(char *) = 4 bytes sizeof(short int) = sizeof(short) = 2 bytes sizeof(char) = 1 bytes 由于是 4 字节对齐,sizeof(struct BBB) = sizeof(*p) = 4 + 4 + 2 + 1 + 1/*补齐*/ + 2*5 + 2/*补齐*/ = 24 bytes (经 Dev-C+验证) p=0 x1000000; p+0 x200=_; = 0 x1000000 + 0 x200*24 (Ulong)p+0 x200=_; = 0 x1000000 + 0 x200 (char*)p+0 x200=_; = 0 x1000000 + 0 x200*4 你可以参考一下指针运算的细节名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -