http://blog.csdn.net/h_armony/article/details/6764811
1. 嵌入式系统中断服务子程序(ISR)
中断是嵌入式系统中重要的组成部分,这导致了很 多编译开发商提供一种扩展—让标准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()经常有重入和性能上的问题。2.C语言中对位的操作,比如对a的第三位清0,第四位置1.本来应该会的,一犯晕写反了,以后注意!#define BIT3 (1<<3)#define BIT4 (1<<4)a &= ~BIT3; a |= BIT4; 3.volatile表示这个变量会被意想不到的改变,每次用他的时候都会小心的重新读取一遍,不适用寄存器保存的副本。volatile表示直接存取原始地址例:并行设备的硬件寄存器(状态寄存器)在多线程运行的时候共享变量也要时时更新一个中断服务子程序中访问到的的非自动变量(定义变量时默认为自动变量,这里指全局变量或加修饰的变量)4.Const:Const char*p //p 指向的内容不能被修改Char const *p; // p指针指向内容不能修改Const (char*) p; //p指针不能修改,p++ 操作会出错Const type fun(); // 返回值类型为一个const type类型,不能修改Fun( const char *p); //保护指针,引用传递的值不被修改.类成员函数:中 fun() const; //表明FUN不能修改成员变量,不调用非const 成员函数.5.要求设置一绝对地址为0x67a9 的整型变量的值为0xaa66int *ptr = (int *)0x67a9;*ptr = 0xaa66;6、#include "stdio.h"int a=0; int b;static char c;int main(int argc,char *argv[]){char d=4;static short e;a++;b=100;c=(char)++a;e=(++d)++;printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);return 0;}a) 写出程序输出答案:a = 2, b = 100, c = 2, d = 6, e = 5 7a)对于整形变量A=0x12345678,请画出在little endian及big endian的方式下在内存中是如何存储的?little endian big endian 刚好反过来高地址–〉 0x12 低地址–〉 0x120x34 0x340x56 0x56低地址–〉 0x78 高地址–〉 0x78记忆方法:小端模式 : 地址的增长顺序与值的增长顺序相同(x86为小端模式)大端模式 : 地址的增长顺序与值的增长顺序相反b)在ARM系统中,函数调用的时候,参数是通过哪种方式传递的?
参数<=4时候,通过R0~R3传递,>4的通过压栈方式传递
8 .1请实现内存复制函数void* memcpy(void* dst, void* src, int count)。
#include <stdio.h>#include <assert.h>void* mem_cpy(void *dst, const void *src, int count) //参数定义为空指针类型,并且源地址内容不应该被改变,因此用const修饰{/*if(NULL==dst || NULL==src)return dst;*/assert(dst); //若传入参数不为真,程序退出assert(src);while(count--){*(char*)dst = *(char*)src; //强制转化为字符指针类型,并进行内容复制dst = (char*)dst +1;src = (char*)src +1;}return dst;}int main(int argc, char* argv[]){char From[100] ="Hello baby!";char To[100] = {0};mem_cpy(To,From,100); //前两个参数位子不要弄错printf("%s\n",From); //输出字符串printf("%s\n",To);return 0;}
精简版
char * strcpy(char * strDest,const char * strSrc) { char * strDestCopy=strDest; assert( (strDest!=NULL) && (strSrc!=NULL) ); // #include <assert.h> while ((*strDest++=*strSrc++)!='\0'); return strDestCopy; }
8.2、不使用库函数,编写函数int strcmp(char *source, char *dest)相等返回0,不等返回-1;
#include "stdafx.h" #include <assert.h> #include <string.h> int strcmp(char *source, char *dest) { int i; assert((NULL != source)&&(NULL != dest)); //判断指针是否为空 if(strlen(source) != strlen(dest)) //判断两字符串长度时候相等,不相等肯定不相等,直接退出 { return -1; } for(i = 0;i < strlen(source);i++) //利用指针,将两字符串逐字比较 { if(*(source + i) != *(dest + i)) //如果不相等,退出 return -1; } return 0; } int main(int argc, char* argv[]) { static char a[2][10]; //定义一个二维数组 int N; printf("input two string\n"); for(int i=0;i<2;i++) { scanf("%s",&a[i][0]); //输入两个字符串 } N=strcmp(&a[0][0],&a[1][0]); //调用自定义函数 if(N == -1) printf(" two different string\n"); else printf("same string\n"); return 0; }
9.1、在数组定义int a[2][2]={{3},{2,3}};则a[0][1]的值为0。(对)9.2、
<span style="FONT-SIZE: 13px">#include <stdio.h> intmain(int argc,char * argv[]) { int a [3][2]={(0,1),(2,3),(4,5)}; int *p; p=a [0]; printf("%d",p[0]); }
问打印出来结果是多少?
答案:1.
分析:花括号里嵌套的是小括号而不是花括号!这里是花括号里面嵌套了逗号表达式!其实这个赋值就相当于int a [3][2]={ 1, 3, 5};
10.0 输入任意字符串,打印输出其逆序:
#include "stdafx.h" #include<stdio.h> #include <stdlib.h> #include<string.h> void s_back(char *p) { int i=0; char *ps; char *pe; char temp; if(!p) return; ps=p; while(*p!=0) p++; //最后一个字符满足要求,p++后指针指向了字符串外的一个地址; pe=p; for(i=0;i<(pe-ps)/2;i++) { temp=*(ps+i); *(ps+i)=*(pe-i-1); //由于pe指向的是字符串外的一个地址,因此这里还必须减一 *(pe-i-1)=temp; } } int main(void) { printf("input:"); char *p=(char *)malloc(10); scanf("%s",p); s_back(p); printf("output:%s\n",p); free(p); return 0; }
11、写一函数int fun(char *p)判断一字符串是否为回文,是返回1,不是返回0,出错返回-1
#include "stdafx.h" #include <assert.h> #include <string.h> int fun(char *p) { int len; if(NULL == p) //检测指针是否有效 return -1; len=strlen(p)-1; printf("len = %d\n",len); for(int i=0;i<(len/2);i++) { printf("*(p+%d)=%c\n *(p+len-%d)=%c\n",i,*(p+i),i,*(p+len-i-1)); if(*(p+i) != *(p+len-i-1)) //判断首尾是否依次相等,即是否为回文 return 0; //不是回文返回0 } return 1; //是回文返回1 } int main(int argc, char* argv[]) { int R; char ch[]="abcdedcba"; R=fun(ch); switch (R) { case -1: printf("error!\n"); break; case 0: printf("it's not huiweng\n"); break; case 1: printf("it's huiweng\n"); break; default: break; } return 0; }
德高培身,财多伤身。