C语言基础,以备后用

1.      Static的用处

1.  Static修饰变量的时候,则该变量存储在静态数据区,如果是局部静态变量则程序分配一次内存,函数结束,变量不消失;如果是全局静态变量则该变量的作用域只能限制在本文件,不能被外部文件引用。

2.  Static修饰函数的时候,使得这个函数的作用域限定在这个文件范围,不能被外部文件引用。

(1.           限制变量的作用域

(2.           设置变量的存储域

2.      引用和指针有什么区别

1.   引用必须被初始化,指针不必。

2.   引用初始化以后不能被改变,指针可以改变所指的对象。

3.   不存在指向空值的引用,但是存在指向空值的指针。  

3.描述实时系统的特性

在特定时间里面完成特定的任务,实时性和稳定性

4. 全局变量和局部变量在内存中的区别

局部变量存储在内存的栈区,作用域为函数域

全局变量存储在静态数据区,作用域为文件域

5.平衡二叉树

6.  堆栈溢出一般是由什么原因导致的?

   分配的内存没有及时回收

7. 冒泡排序算法的时间复杂度

   O(n^2)

8. 写出float x 零值比较的if语句

   If((x >= -0.000001)&&(x<= 0.000001))

9.  typedef union {long i;int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
则语句printf("%d",sizeof(struct date)+sizeof(max));输出为_52___

10. 队列和栈的区别

队列先进先出,栈后进先出

11. #include<stdio.h>
int inc(int a)
{
return(++a);
}
int multi(int *a, int *b,int*c)
{
return(*c=*a**b);
}
typedef int(FUNC1)(int in);
typedef int(FUNC2) (int*,int*,int*);

void show(FUNC2  
fun, int  arg1,  int*arg2)
{
INC p=&inc;
int temp =p(arg1);
fun(&temp,&arg1, arg2);
printf("%d\n",*arg2);
}

main()
{
int a;
show(multi,10,&a);
return 0;
}

 

输出为:110

 

 

12. 以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”

 1#include"string.h"
2
main()
3
{
4
char*src="hello,world";
5
char* dest=NULL;
6
int len=strlen(src);
7
dest=(char*)malloc(len);
8
char* d=dest;
9
char* s=src[len];
10
while(len--!=0)
11
d++=s--;
12
printf("%s",dest);
13
return 0;
14
}

 

改:6.  int len = strlen(src)+1;

9.  char *s = &src[len-1];

11 . *d++= *s--;

增加:*d = 0;

free(dest);

13. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) 

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

14. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个

         #define MIN(X,Y)  ((X)<=(Y)?(X):(Y))

15. 预处理器标识#error的目的是什么? 

         编译的时候提示错误信息!

16.  嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?

        

While(1)

}

17. 用变量a给出下面的定义
a) 一个整型数(An integer)    int a;
b) 一个指向整型数的指针(A pointer to an integer) int*a;
c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer
to an integer)int **a;
d) 一个有10个整型数的数组(An array of 10 integers) inta[10];
e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to
integers)  int*a[10];
f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)  int (*a)[10];
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a fu
nction that takes an integer as an argument and returns an integer)int (*a)(int a);
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型
数( An array of ten pointers to functions that take an integer argumentand r
eturn an integer )int(*a[10])(int a);

 

18. 关键字const是什么含意?

只读的意思

const int a;   a是一个常整形
int const a;       a是一个常整形
const int *a;     a是一个指向常整形的指针
int * const a;    a是一个指向整形的常指针
int const * a const;  a是一个指向常整形的常指针

19. 关键字volatile有什么含意 并给出三个不同的例子

         指示这个变量禁止编译器进行优化,容易被外部条件意外的改变

1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量

 

19.1 一个参数既可以是const还可以是volatile吗?解释为什么。

是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。
它是const因为程序不应该试图去修改它

20. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码
,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。

#define mask  (0x1<<3)

void Set_bit3(int a)

{

a |= mask;

}

 

 

void Clr_bit3(int a)

{

         a &= ~mask;

}

21. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求
设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写
代码去完成这一任务

这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的

int *p = (int *)0x67a9;

*p = 0xaa66;

22. 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展让标
C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了
__interrupt
关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf(" Area = %f", area);
return area;
}

1). ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。
2). ISR
不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。
3).
在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额
处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短
而有效率的,在ISR中做浮点运算是不明智的。
4).
与第三点一脉相承,printf()经常有重入和性能上的问题。

 

23. 下面的代码输出是什么,为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ?puts("> 6") : puts("<= 6");
}

输出为大于6;


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种通用的编程语言,它可以用于开发各种类型的应用程序,包括服务器应用程序。以下是一些C语言服务器编程的方法和必备常识: 1. 理解网络协议:C语言服务器编程需要对网络协议有一定的了解。常见的网络协议包括TCP/IP、HTTP、FTP等。了解这些协议可以帮助你更好地理解服务器编程的基础知识。 2. 使用Socket编程: Socket是一种用于网络通信的API,可以让你使用C语言进行网络编程。你可以使用Socket编程来创建服务器应用程序,处理客户端请求和响应。Socket编程需要掌握一些基本的函数和概念,如socket()、bind()、listen()、accept()、send()和recv()等。 3. 处理多个客户端:服务器应用程序通常需要同时处理多个客户端请求。为此,你需要使用多线程或多进程技术。多线程技术可以让你在单个进程中同时处理多个客户端请求,而多进程技术则可以让你使用多个进程来处理客户端请求。 4. 了解并发编程:服务器应用程序需要处理大量的并发请求。为此,你需要掌握并发编程的基本知识,例如线程同步、互斥锁、条件变量等。 5. 考虑安全性:服务器应用程序需要考虑安全性,以避免恶意攻击和数据泄露。你需要使用安全编程技术,如SSL/TLS协议、加密算法等,来保护服务器应用程序和通信数据的安全性。 6. 了解操作系统和硬件:服务器应用程序需要运行在操作系统上,因此你需要掌握操作系统和硬件的基本知识,例如进程管理、内存管理、IO操作等。 以上是一些C语言服务器编程的方法和必备常识,希望对你有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值