嵌入式C语言基础:
system函数:功能是运行windows命令
#include <stdio.h>
#include <stdlib.h>
int main()
{//main是程序的入口,操作系统运行程序先找mainsystem("ipconfig");//在windows下ipconfig查看本地的网络状态system("pause");//pause是程序运行后不直接退出return 0;//一般函数调用返回给操作系统,如果正常返回都是0,若出错返回负数。
}
//system("color 3");可设置输出信息的颜色数字可变。
以上代码运行结果如图:
同样也可以用system启动QQ:
- 首先要找到QQ的安装路径,我这里是C:\Program Files (x86)\Tencent\QQ\Bin
- 可以win+R调用命令窗口运行一下start C:“Program Files (x86)”\Tencent\QQ\Bin\QQ.exe 注意:因为Program Files (x86)之间有空格所以要用双引号引起来当做字符串。然后我们就可以将命令写入到程序中去。
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{system("start C:\\\"Program Files (x86)\"\\Tencent\\QQ\\Bin\\QQ.exe");system("pause");//若将这段代码注释掉,则运行完QQ后不会停留在按任意键继续那个界面。return 0;
}
//若直接将命令拷贝到system函数中
//会因字符串中有字符串而报错,所以要将字符串转义,反斜杠也要转义。
转义字符有下表:
变量:
数据是存放在内存中的,都是以010…这些二进制的数字在内存中存放的。定义变量格式:数据类型 变量名 ,若将变量输出要有占位符如%d,%f,%lf等
数据类型都有:
函数:
#include <stdio.h>
#include <stdlib.h>
/*
1、这里的a是形式参数
2、形式参数也是一个变量,局部变量,有自己的内存空间
3、当函数被调用的时候才申请了该内存空间,才有了这个变量同时这个空间内的数据被赋值成实际参数的值,函数调用把实际参数的值拷贝一份给形式参数。
4、函数执行结束后,该空间由内存管理单元自动回收(释放)
5、形参中的地址(虚拟地址)和实际参数的地址不一样
*/
void test(int a)//a 它是局部变量,同时它是一个形式参数,作用域仅限该函数
{printf("hello %d\n",a);printf("函数中a的地址:%p\n",&a);
}
int main()
{int a=1;test(a);printf("main 中a的地址是:%p\n",&a);system("pause");return 0;
}
getchar()函数用来吸收字符(回车也是字符)
数组:
#include <stdio.h>
#include <stdlib.h>
int main()
{//数组地址是连续的 //数组通过下标来引用数组中的元素,从0开始//数组的中括号[],只有在定义一个数组的时候,才表示数组的大小,其余任何情况都表示用下标来访问数组。int arry1[100];//初始化数组,仅仅申请了100个整型数的内存空间int arry2[3]={1,2,3};//有初始化的数组,完整初始化,该数组申请了三个整形数的内存空间,并赋值三个数1,2,3int arry3[100]={1,2,3};//有初始化的数组,不完整初始化,该数组申请了100个整形数内存空间,并赋值三个数1,2,3放在数组的前三位。int n;scanf("%d",n);int arry4[n];//实际应用中无报错可使用,但是一些教材中认定为非法。system("pause");return 0;
}
数组和函数:
#include <stdio.h>
#include <stdlib.h>
void arrayPrint(int data[3])
{int i;for(i=0;i<3;i++){printf("%d ",data[i]);}putchar('\n');//输出完毕后换行,putchar()是输出一个字符,getchar()是用来获取一个字符
}
int main()
{int array[3]={1,2,3};//数组和函数结合,数组名当做实际参数arrayPrint(array);//问:如何计算数组中元素的个数, 数组的总大小/一个类型的大小int a[3]; //一个整型占用空间4个字节,3个占用空间12个字节char b[3]; //一个char型占用空间1个字节,三个占用空间3个字节//相同点:数组中元素的个数相同//不同点:叔祖类型不同,数组的内存大小不同printf("a数组的大小是:%d\n",sizeof(a));//sizeof是关键字并不是函数printf("b数组的大小是:%d\n",sizeof(b));printf("一个整数的空间是:%d\n",sizeof(int));printf("一个字符型的空间是:%d\n",sizeof(char));printf("a数组有%d个元素\n",sizeof(a)/sizeof(a[0]));//或者写为sizeof(a)/sizeof(int)printf("b数组有%d个元素\n",sizeof(b)/sizeof(b[0])); //可以将sizeof()封装成函数,sizeof(a)/sizeof(a[0]),不管数组是什么类型,都可以这样计算 system("pause");return 0;
}
注意:形式参数中,虽然写的是一个数组的样子,中括号中数组的大小是无效的!!!!!
#include <stdio.h>
#include <stdlib.h>
void arrayPrint(int datas[],int cnt)
//数组做函数的参数会退化为指针
//形式参数中,虽然写的是一个数组的样子,中括号中数组的大小是无效的!!!!!
//这里不管中括号写多少,都不能代表形参数组有多大,仅仅告诉编译器这个datas和普通的整型不一样是一个数组,所以数字可写可不写
//这里的中括号的作用仅仅用来表示该参数是一个地址!在windows啊哈c中,用4个字节表示地址,linux64位中用8个字节表示。
{printf("数组的大小是:%d\n",sizeof(datas));printf("一个int数据大小是:%d\n",sizeof(int));printf("函数调用中:array数组元素个数为%d\n",sizeof(datas)/sizeof(datas[0]));int i;for(i=0;i<cnt;i++){printf("%d ",datas[i]);}putchar('\n');//输出完毕后换行,putchar()是输出一个字符,getchar()是用来获取一个字符
}int main()
{int array[4]={1,2,3};printf("数组的大小是:%d\n",sizeof(array));printf("main中:array数组元素个数为%d\n",sizeof(array)/sizeof(array[0]));//arrayPrint(array,sizeof(array)/sizeof(array[0]));//要想输出数组可以设置两个参数arrayPrint(&array[0],sizeof(array)/sizeof(array[0]));//数组名表示数组第一个元素的地址,所以也可以用的一个元素的地址作为参数system("pause");return 0;
}
C语言定义宏计算数组个数:
#include <stdio.h>
#define NTBL (sizeof(table)/sizeof(table[0]))
int main()
{int table[]={1,2,3,4,5,6,7};printf("%d \n",NTBL);system("pause");return 0;
}
/*第二种方式*/
#include <stdio.h>
#define NTBL(arr,len){len=sizeof(arr)/sizeof(arr[0]);}
int main()
{int longth,array[]={1,2,3,4,5,6,7};//printf("%d \n",NTBL);NTBL(array,longth);printf("%d \n",longth);system("pause");return 0;
}
练习:
#include <stdio.h>
#include <stdlib.h>
void initScores(int datas[],int size)
{int i;for(i=0;i<size;i++){printf("请输入第%d个学生的分数\n",i+1);scanf("%d",&datas[i]);if(datas[i]<0 || datas[i]>100){printf("输入错误,强制退出\n");system("pause");exit(-1);}}
}
void arrayPrint(int datas[],int size)
{int i;for(i=0;i<size;i++){printf("第%d个学生的成绩是%d\n",i+1,datas[i]);}
}
int findMax(int datas[],int size)
{int i;int max=0;for(i=0;i<size;i++){if(datas[i]>max){max=datas[i]; }}return max;
}
int findMin(int datas[],int size)
{int i;int min=datas[0];for(i=0;i<size;i++){if(datas[i]<=min){min=datas[i]; }}return min;
}
float findAverge(int datas[],int size)
{int i;int sum=0;float ave;for(i=0;i<size;i++){sum=datas[i]+sum;}ave=(float)sum/size;return ave;
}
void printRet(int data1,int data2,float data3)
{printf("最高分是:%d,最低分是:%d,平均分是:%f\n",data1,data2,data3);
}
int main()
{int scores[3];int len;int max;int min;float averge;len=sizeof(scores)/sizeof(scores[0]);//1、初始化数组initScores(scores,len);//1.1打印数组arrayPrint(scores,len);//2、找到最高分max=findMax(scores,len);//3、找到最低分min=findMin(scores,len);//4、算出平均分averge=findAverge(scores,len);//5、输出结果printRet(max,min,averge);system("pause");return 0;
}
指针的概述:
#include <stdio.h>
#include <stdlib.h>
//通过变量名直接访问变量
//变量访问有两种方式:①变量名②地址(指针)
//指针=地址
int main()
{int a=10;printf("通过变量名输出:a=%d\n",a);printf("a的地址是:%p\n",&a);printf("通过地址输出:a=%d\n",*(&a));//*是将地址中的内容取出来,&a是地址system("pause");return 0;
}
指针变量:
#include <stdio.h>
#include <stdlib.h>
//*只有在定义一个指针变量的时候才是标识符
//其他情况是运算符,该运算符的作用是取出内存地址中数据的值
int main()
{int a=10;int b=20;int* p1;//指针变量,存放的是地址p1=&a;//给指针变量赋值int* p2=&b;//定义并初始化一个指针变量printf("通过变量名a=%d\n",a);printf("通过指针变量a=%d\n",*p1);printf("通过指针变量b=%d\n",*p2);system("pause");return 0;
}