C语言部分题目解析
来源:互联网 发布:c#数组去重的方法 编辑:程序博客网 时间:2024/05/01 05:25
C语言部分题目解析
1、有以下程序
#include <stdio.h>int main (){int i = 1, j = 2, k = 3;if (i++ ==1 || (++j == 3 || k++ == 3))printf(“%d%d%d\n”, i, j, k);return 0;}
答案:223
解析:|| 全假为假,有真即真 ,i++ == 1, 先取i与1比较,再自增,成立且+1为2,||后面不再计算
2、char a[7] = “a0\0a0\0”;则
sizeof (a) = 7; 数组字节数1 * 7 = 7
strlen (a) = 2; 计算有效长度,即第一个\0为止,且不计算\0
3、
#include<stdio.h>void f(int *x, int *y){ int *t; t= x; x= y; y= t;}int main (){ int a[8] = {1, 2, 3, 4, 5, 6, 7, 8},i, *p, *q; p= a; q= &a[7]; while(p < q) { f(p, q); p++; q--; } for(i = 0; i < 8; i++) printf("%d",a[i]); return 0;}
答案:12345678
解析:调用函数f,只能改变形参地址,没有通过地址的解引用改变数组的值(可以通过画内存图分析)
4、
#include<stdio.h>int fun(int a){ int b = 0; staticint c = 2; b++; c++; return (a + b + c);}int main(){ int i,a = 5; for (i = 0; i < 3; i++) printf("%d%d",i,fun(a)); return 0;}
答案:09110211
解析:static int c = 2,静态变量,在内存的静态存储区,只初始化一次以后再次使用将使用上一次的值。i = 0, a = 5, b = 1, c = 3; i= 1,a = 5, b = 1, c = 4; i = 2, a = 5,b= 1, c = 5
5、
#include<stdio.h>#include <stdlib.h> //free()#include <string.h> //strlen()int main(){ char *src = "hello,world"; char *dest = NULL; long len = strlen(src); dest = (char *)malloc(len + 1); //strlen不计算'\0',malloc要加1 char *d = dest; char *s = &src[len - 1]; //取最后一个元素地址 while (len-- != 0) { *d++ = *s--; //解引用赋值 } *(d + len + 1) = '\0'; //倒序赋值结束之后,*d后面加'\0',*d ='\0'; printf("%s,%ld\n",dest,sizeof(strlen(src))); free(dest); //释放开辟的堆空间 return 0;}
6、
#include<stdio.h>void main(){ int a = 1, b; for(b = 1;b <= 10; b++) { if(a >= 8) break; if(a % 2 == 1) { a += 5; continue; } a = 3; } printf("%d\n",b);}
答案:4
解析:b = 1, a = 1,进入循环,a += 5, a变成6,continue 结束本次循环进行下一次循环; b = 2, a = 6, 第二次循环,a = 3,a变成3; b = 3, a = 3, 第三次循环,a +=5 , a变成 8; b = 4, a = 8 , 第四次循环,break,跳出循环
7、编程实现,删除字符串s中值为c的字符串
void Delchar(char s[] , char c){ int i, x, len; len = strlen(s); for (i = 0; i < len; i++) { if (s[i] == c) { for (x = i; s[x] != '\0'; x ++) s[x] = s[x + 1]; len--; } }}
8、该程序有什么问题?
#include <stdio.h>#include <stdlib.h>void GetMemory(char **p, int num){ *p = (char *)malloc (num);}int main(){ char *str = NULL; GetMemory(&str, 100); strcpy(str, "hello"); printf("str1 is %s \n",str); free(str); //已经释放堆空间,虽然得到地址并可以进行修改,但是该块内存空间已经自由,不被原变量控制 if(str != NULL) { strcpy(str, "hello,Baby!"); } printf("str3 is %s \n",str);}
9、该程序有什么问题?
#include <stdio.h>int main(){ char a; char *s = &a; strcpy(s,"hello"); //a是char类型,内存中占1个字节,s是char类型指针,它的值是a的地址,不能通过strcpy来对s赋值 printf("%s\n",s); s= "hello2"; //可以通过这条语句,让s指向另外的“hello” //*s = "hello3"; printf("%s\n",s);}
10、
#include <stdio.h>int main(){ int a[5] = {1, 2, 3, 4, 5}; int *p = (int *)(&a + 1); printf ("%p\n",a); printf ("%p\n",&a); printf ("%p\n",&a[0]); printf ("%p\n",a+1); printf ("%p\n",&a[1]); printf ("%p\n",&a+1); printf ("%p\n",p); printf ("%p\n",&a[5]); printf ("%p\n",&a[4]); printf ("%p\n",p-1); printf("%d, %d\n",*(a + 1),*(p - 1));}
答案:2, 5
解析:
0x7fff5fbff8c0 a的地址,即a[0]的地址
0x7fff5fbff8c0 &a
0x7fff5fbff8c0 a[0]的地址
0x7fff5fbff8c4 a的地址的下一个元素的地址
0x7fff5fbff8c4 a[1]的地址
0x7fff5fbff8d4 取整个数组a的地址再加1,p指向下一个a[5]的第一个元素
0x7fff5fbff8d4 p的地址
0x7fff5fbff8d4 a[5]的地址
0x7fff5fbff8d0 a[4]的地址
0x7fff5fbff8d0 p-1的地址
2, 5
11、
#include <stdio.h>intmain(){ int a = 2, b = 4; int const c = 3; const int *d = &a; int *const e = &d; int const * const f = &a; *c = 32; //c是一个整型常量,不是指针,不能解引用 d = &b; *d = 43; //d指向常量的指针,不能通过解引用改变值 e = 34; //e是整形指针常量,一经初始化不能更改其值 e = &a; //e是整形指针常量,一经初始化不能更改其值 f = &b; //f和*f都不能更改}
- C语言部分题目解析
- 部分C语言题目
- C语言助教题目代码部分
- 朗讯笔试题目--C语言部分(zz)
- 嵌入式linux工程师面试题目C语言基础部分(转)
- 嵌入式linux工程师面试题目C语言基础部分
- 嵌入式linux工程师面试题目C语言基础部分
- 嵌入式linux工程师面试题目C语言基础部分 (2
- 数组概念和题目分析(C语言部分)z
- 第一个竞赛题目(c语言部分)
- socket c语言程序 c/s tcp模式 (题目部分)
- leetcode部分题目(C++)
- c语言面试题目
- 一道C语言题目
- C语言笔试题目
- c语言题目
- c语言100题目
- C语言笔试题目
- wcf 客户端与服务器之间在传递DataTable问题
- Hans表的简单操作
- ATL::CImage 使用范例
- Android ListView工作原理完全解析,带你从源码的角度彻底理解
- 调用小程序查看器的2个方法
- C语言部分题目解析
- Linux下Nagios的安装与配置
- 数组的添加、删除、排序、与字符串之间的转换、截取、查找、遍历操作总结!!!
- Android Support 包里究竟有什么
- linux系统连接串口工具打印log
- 盗墓笔记
- SylixOS的BSP开发实例之S3C2416 【第四篇】S3C2416 的 GDB 初始化脚本
- poj3373--Changing Digits(DFS+剪枝///记忆化)
- 【暴力搜索】[HDU 1175]连连看