分别写出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
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;
}
答: 10, 12, 120
当出现难以区分的若干个“+”或“-”组成运算符串时,C语言规定:从左到右取尽可能多的符号组成运算符。
int a = 5,b = 5;
a+++b //相当于(a++)+b,结果为10,运算后a为6,b不变
a---b //相当于(a--)-b,结果为0,运算后a为4,b不变
答:数组要么在静态储存区被创建(如全局变量),要么在栈上被创建。指针可以随时指向任意类型的内存块。
修改内容上的差别
char a[] = "Hello";
a[0] = 'X';
char *p = "World" //注意p指向常量字符串
p[0] = 'X' //编译器不会报错,但运行时会报 段错误(Segmentation fault)
用运算符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字节
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针
void Func(char a[100])
{
// 8 个字节而不是 100 字节
printf("Array Size = %ld\n",sizeof(a));
}
不调用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
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;
}
描述实时操作系统的基本特性
在特定时间内完成特定的任务,实时性高且可靠性强
在ARM平台上,C语言函数调用时,通过堆栈方式传递参数
答:调用函数时,实际上是从正在运行的函数跳转到了被调用函数,这个时候,程序当前运行时所用的参数如果不进行保存的话,那么当执行完被调用函数跳转回原先的函数时,缺少必要的参数,程序就无法正常执行。因此,在调用函数之前,需要先保存现场信息,即先把参数压栈,然后再返回地址。
不断更新ing