嵌入式C语言开发笔记

本文详细介绍了嵌入式C语言开发中的核心概念,包括变量定义、输入输出、函数使用、指针操作和字符串处理。讲解了变量的命名规则、输入输出函数如printf和scanf,以及指针的类型、NULL值、数组和指针的关系。此外,还探讨了字符串的结束标志、常用字符串函数以及结构体在嵌入式开发中的应用。

一、变量

1、在程序运行过程中,其值可以改变;
2、要先定义再使用;
3、变量名由字母、数字和下划线组成,且只能以下划线或者字母开头,不能以数字开头;
4、数据类型:整型数(int)、字符型(char)、浮点型(float);
5、变量的三要素:
① 数据类型 : 决定在内存中分配的空间。
② 变量名 : 空间别名。
③ 值 :空间中存储的数据。
6、变量命名方法
①驼峰命名法
指混合使用大小写字母来构成变量和函数的名字。当变量名或函数名是由一个或多个单词连结在一起构成的唯一识别字时,第一个单词以小写字母开始,从第二个单词开始以后的每个单词的首字母都采用大写字母,例如:myName、myAge,这样的变量名看上去就像骆驼峰一样此起彼伏,因此被称为驼峰命名法。

int *treeBase;
int elemNum;
int treeSize;

②帕斯卡(Pascal)命名法
也叫大驼峰法,与驼峰命名法类似,不过骆驼命名法是首字母小写,而帕斯卡命名法是首字母大写。

int *TreeBase;
int ElemNum;
int TreeSize;

③ 下划线命名法
与驼峰命名法相似,通过一种方式将不同单词区分开,方便读懂变量含义。与驼峰命名法不同的是,驼峰命名法采用的是首字母大写区分,下划线命名法是在不同单词之间添加下划线。

int *tree_base;
int elem_num;
int tree_size;

总结:一般变量名用驼峰命名法,函数名用帕斯卡(Pascal)命名法,函数名的首字母最好需要大写。

二、输入与输出

1、printf()、scanf()、getchar()、putchar()、puts()、gets()。
2、puts和printf的区别:
① puts会自动加入换行符;
② printf支持多种花样输出,而puts就是输出字符串。
3、getchar() & putchar() 函数
int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。您可以在循环内使用这个方法,以便从屏幕上读取多个字符。
int putchar(int c) 函数把字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符。

#include <stdio.h>

int main( )
{
   
   
   int c;
 
   printf( "Enter a value :");
   c = getchar( );
 
   printf( "\nYou entered: ");
   putchar( c );
   printf( "\n");
   return 0;
}

当上面的代码被编译和执行时,它会等待您输入一些文本,当您输入一个文本并按下回车键时,程序会继续并只会读取一个单一的字符,显示如下:

Enter a value :runoob

You entered: r

4、gets() & puts() 函数
char *gets(char *s) 函数从 stdin 读取一行到 s 所指向的缓冲区,直到一个终止符或 EOF。
int puts(const char *s) 函数把字符串 s 和一个尾随的换行符写入到 stdout。

#include <stdio.h>
 
int main( )
{
   
   
   char str[100];
 
   printf( "Enter a value :");
   gets( str );
 
   printf( "\nYou entered: ");
   puts( str );
   return 0;
}

当上面的代码被编译和执行时,它会等待您输入一些文本,当您输入一个文本并按下回车键时,程序会继续并读取一整行直到该行结束,显示如下:

Enter a value :runoob

You entered: runoob

三、函数

1、冒泡排序法

int main()_
{
   
   
int array[]={
   
   12,34,22,45,67,88,43,65,24,56};
int i;
int j;
int tmp;
int len=sizeof(array)/sizeof(array[0]);

for(i=0;i<len-1;i--)
	{
   
   
	for(j=0;j<len-1-i;j--)
	{
   
   
		if(array[j]>array[j+1])
		{
   
   
			tmp=array[j];
			array[j]=array[j+1];
			array[j+1]=tmp;
		}
	}
	}
		for(i=0;i<len;i++)
	{
   
   
		printf("%d ",array[i]);
	}
	return 0;
}

2.、简单选择排序法

int main()
{
   
   
	int array[]={
   
   12,8,13,9};
	int i,j;
	int tmp=0;
	int len=sizeof(array)/sizeof(array[0]);
	for(i=0;i<len-1;i++)
	{
   
   
		for(j=i+1;j<len;j++)
		{
   
   
			if(array[i]<array[j])
			{
   
   
				tmp=array[j];
				array[j]=array[i];
				array[i]=tmp;
			}
		}
	}
	for(i=0;i<len;i++)
	{
   
   
		printf("%d ",array[i]);
	}
	return 0;
}

3、形式参数,需要包含变量类型,变量名,被调用的时候才为形式参数申请内存,调用结束,内存被系统释放。
4、在函数的形参中,不存在数组的概念,即便中括号中约定了数组的大小,也无效;因为形参传递的是一个地址,是数组的首地址。
5、全局变量:写在所有函数之前的外部变量,程序员使用全局变量,编程便捷,但是又隐藏风险!所有的函数都可以操作这个变量。

四、指针

1、指针变量是存放别人地址的变量,为什么要区分类型呢?
因为指针决定指向空间的大小,也决定增量,不同类型的变量,内存大小不一样。
2、C 中的 NULL 指针:
在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。NULL 指针是一个定义在标准库中的值为零的常量。请看下面的程序:

#include <stdio.h>
 
int main ()
{
   
   
   int  *ptr = NULL;
 
   printf("ptr 的地址是 %p\n", ptr  );
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

ptr 的地址是 0x0

在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的。然而,内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。
如需检查一个空指针,您可以使用 if 语句,如下所示:

if(ptr)     /* 如果 p 非空,则完成 */
if(!ptr)    /* 如果 p 为空,则完成 */

3、数组的首地址就是数组首个元素的地址,数组名就是数组的首地址。
4、数组名和指针的区别:数组名可看作是指针常量,不可以自加或者自减运算,这点不同于指针变量。
5、* 的标识作用:只产生在指针变量定义或声明的时候。
6、二维数组与地址的关系:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
7、数组指针

int (*p)[4]

在这里插入图片描述
在这里插入图片描述
8、函数指针
定义函数地址:如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针。函数名就是地址,就像数组名就是地址一样。
函数调用概念和变量一样,分为直接访问和间接访问;直接访问:变量名、函数名;间接访问:指针、函数指针。用法如下:

#include<stdio.h>

void printWelcome()
{
   
   
	printf("程序启动,欢迎使用!\n");
}
int main()
{
   
   
	int a=10;
	int *p;
	p=&a;
	printf("%d\n",*p);
	void (*pa)(); //定义一个函数指针变量
	pa=printWelcome; //指向函数
	printWelcome();
	(*pa)(); //调用
	return 0;
}
#include<stdio.h>

int inAddData(int data)
{
   
   
	return ++data;
}
void printWlecome()
{
   
   
	puts("程序启动,欢迎使用");
}
int main()
{
   
   
	void (*p1)();//定义一个函数指针变量
	int (*p2)(int data);//尽量和指向函数的格式一致,不容易出错
	
	p1=printWlecome;//指向函数
	p2=inAddData;
	
	(*p1
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值