嵌入式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;
}