嵌入式软件工程师岗位基础题(2)

与零值判断

分别写出BOOL,int,float,指针类型的变量 a 与 “零” 的比较语句

if(!a) or if(a);	// BOOL
if(a == 0)			//int
// float
const EXPRESSION EXP = 0.000001
if(a<EXP && a>EXP)

if(a != NULL) or if(a == NULL)	//指针pointer

自加自减

a++:先执行a,之后再加1。
++a:先加上1,再执行a。

例程:请写出下列代码的输入内容

#include <stdio.h>
int main()
{
    
    
	int a,b,c,d;
	a = 10;
	b = a++;
	c = ++a;
	d = 10*a++;
	printf("b, c, d: %d, %d, %d\n",b,c,d);
	return 0;
}

答: 1012120

当出现难以区分的若干个“+”或“-”组成运算符串时,C语言规定:从左到右取尽可能多的符号组成运算符。

int a = 5,b = 5;
a+++b  	//相当于(a++)+b,结果为10,运算后a为6,b不变
a---b	//相当于(a--)-b,结果为0,运算后a为4,b不变

数组与指针的区别

答:数组要么在静态储存区被创建(如全局变量),要么在栈上被创建。指针可以随时指向任意类型的内存块。

  1. 修改内容上的差别

    char a[] = "Hello";
    a[0] = 'X';
    
    char *p = "World" //注意p指向常量字符串
    p[0] = 'X'		  //编译器不会报错,但运行时会报 段错误(Segmentation fault)
    
  2. 用运算符sizeof可以计算出数组的容量(字节数)。sizeof(p),p为指针得到的是一个 指针变量的字节数,而不是p所指向的内存容量。

    char a[] = "Hello World";
    char *p = a;
    printf("a = %ld\n",sizeof(a));	//12字节
    printf("p = %ld\n",sizeof(p));	//32位—4字节 64位—8字节
    
  3. 注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针

    void Func(char a[100])
    {
          
          
    	// 8 个字节而不是 100 字节
    	printf("Array Size = %ld\n",sizeof(a));
    }
    

Strcpy函数复现

不调用C/C++的字符串库函数,编写函数strcpy:

char *strcpy(char *strDes, const char *strSrc)
{
    
    
	assert((strDes != NULL) && (strSrc != NULL));
	char *address = strDes;
	while((*strDes++ = *strSrc++) != '\0');
	return address;
}

++的优先级大于 *

while部分代码分析

*strSrc赋值给*strDest,然后判断里面是不是到达\0(即字符结尾),同时,执行完赋值后 strSrc 和 strDest 指针同时后移一位。


数组

数组元素个数

已知一个数组table,用一个宏定义,求出数据的元素个数

#define	NTBL (sizeof(table)/sizeof(table[0]))
数组清零
//置字节字符串s的前n个字节为零且包括‘\0’
void bzero(void *s, int n);	

//将s中前n个字节用 ch 替换并返回 s 
void *memset(void *s,int ch,size_t n);

例程:清除数组str[10]内容

#include <stdio.h>

int main()
{
    
    
	char str[10] = "Hello,Mcu";
	char *pStr;
	
	printf("First str: %s\n",str);
	//方法一
	bzero(str,10);
	printf("Clear str: %s\n",str);
	
	//方法二
	pStr = memset(str,0,10);
	printf("Clear str: %s\n",pStr);
	printf("Clear str: %s\n",str);
	return 0;
}

基础

  1. 描述实时操作系统的基本特性
    在特定时间内完成特定的任务,实时性高且可靠性强

  2. 在ARM平台上,C语言函数调用时,通过堆栈方式传递参数

    答:调用函数时,实际上是从正在运行的函数跳转到了被调用函数,这个时候,程序当前运行时所用的参数如果不进行保存的话,那么当执行完被调用函数跳转回原先的函数时,缺少必要的参数,程序就无法正常执行。因此,在调用函数之前,需要先保存现场信息,即先把参数压栈,然后再返回地址。

不断更新ing

猜你喜欢

转载自blog.csdn.net/qq_30722795/article/details/108160482
今日推荐