C语言中函数使用

函数

一堆代码的集合,用一个标签去描述它,实现复用化
函数具备3要素
1、函数名
2、输入参数
3、返回值

指针表示函数
int (*p)(int char)

例如函数名地址为0x12345
将他赋值给指针
int p;
p=(int(
)(。。形参))0x12345需要对数字进行强制类型转换,否则只是一串数字无法识别

int (*p【7】)(int int)函数指针数组

实参传送给形参,传递的形式:拷贝

值传递

实参拷贝一份副本给形参,不改变原值

上层调用者,保护自己空间不被修改

地址传递

上层,调用者让 下层子函数修改自己空间值的方式
作用:
1、修改 (典型形参形式int * char*)
2、空间传递
子函数看空间里的情况 const修饰的,只是查看功能
子函数反向修改上层空间里的内容(修改空间两个要素1.空间首地址2空间结束标志) char * 、
viod
{
修改的空间分类
1、字符空间
与非字符空间区别:结束标志不同。
结束标志:内存里存放了0x00(1B),字符空间
非字符空间0x00,不能当成结束标志

strlen
}

对于空间的修改最好要写成viod*p

连续空间传递

1、数组
数组名——标签
实参:
int abc 【10】
fun(abc)
形参
void fun (int *p) void fun (int p【10】)(10是给人看的,实际相当于第一种写法)
2、结构体
结构体变量
实参
struct abc{int a;int b;};
struct abc buf;
形参:
void fun (struct abc a1)

连续空间的传递尽量用地址传递,节省空间

连续空间的只读性
加了const变为只读空间,也防止别人用你的函数导致段错误
char*p 可能修改
sprintf

字符空间与非字符空间
结束标志不同字符空间以0为结束标志,而非字符空间不是。

char p代表字符空间(标识符)
但是unsigned char
p是非字符空间
非字符空间结束标志大多数为数量:字节单位

void fun(unsigned char*p,int len)要有个长度单位参数限制空间大小

void* 非字符空间的数据空间标识符
因为非字符空间每次传入的参数大小不一样,有时是int有时是结构体,所以用void*表示接收任意一种地址
%s也是碰到0停止输出

看到void*默认是空间修改
而看到int short long默认是单变量修改

函数返回值

基本语法
返回类型 函数名 (形参)
{
return ;
}
返回值 变量接收的拷贝值
不能返回数组空间
函数可以返回结构体,但是太占内存

返回连续空间类型
指针作为空间返回的唯一数据类型
使用int*fun()时,
要注意指针指向的合法性,不能指向栈空间(局部变量)
例如
int fun(void)
{
buf【】=“hello world”;
return buf;
}
int main()
{
int
p;
p=fun();
return 0;
}
这段程序p 会指向一个乱七八糟的空间,因为函数返回的是buf的地址,buf 是个局部变量,fun函数结束就会收回buf的空间
staic 静态空间,数据段

嵌入式工程师必备0x10道题

常见面试题宏定义
一、用预处理指令#define声明一个常熟,用以表明一年有多少秒(不考虑闰年)
一般形式:#define 宏名 宏体
考察点:宏名:一般 是用大写表示 宏体是表达式要加括号,保护防止二义性 后面加L限制符,因为不同CPU的int类型长度不同,加了L限制在4字节.因为秒是没有符号的数来表示,所以加个U。
#define SECOND_OF_YEAR (3652460*60)UL

note:8bit:0-255 16bit:65535

二、用变量a给出下列定义:
1.a 是一个整型数(AN INTEGER)
int a;
2.一个指向整型数的指针(A pointer to an integer)
int*a;
3.一个指向指针的指针,它指向的指针是指向一个整型数
int **a;
4.一个有十个整型数的数组
int a【10】;
5.一个有十个指针的数组,该指针是指向一个整型数的
int *a【10】;
6.一个一个指向有10个整型数数组的指针
int(*a)【10】;
7一个指向函数的指针,该函数有一个整型参数并返回一个整型数
int (*a)(int)
8.一个有十个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数
int (*a【10】)(int)

三、类型修饰符
对内存资源存放位置的限定,资源属性中位置的限定

关键字static的作用是什么?
1.修饰局部变量(默认在栈空间,生存期比较短)加了static 就变为局部静态化,局部变量就在静待数据段中保存。生存期就变长。主要作用是把这个空间交由上层再 调用
2.修饰全局变量
防止重命名,限制变量名只在本文件内起作用
3.修饰全局函数
防止重命名 ,限制该函数只在本文件中起作用

例如有两个文件中都有int a 加了static之后,表示该变量只在本文件中生效

关键字const有什么含意?
C中:只读,建议性符号,不具备强制性
C++常量
C中指针越界可以改const

关键字volatile有什么含义?并给出三个不同的例子。
防止C语言编译器的优化
他修饰的变量,该变量的修改可能通过第三方来修改

四、位操作
嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整形变量a;写两端代码。第一个设置(set置1)a的bit3,第二个清除(clear置0 )a 的bit3.在以上两个操作中要保持其它位不变
unsigned int a;
a=a||(0x1<<3);用左移三位
a=a&&~(0x1<<3);

在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66.编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。
intp=(int)0x67a9
p【0】=0xaa66;
*p=0xaa66;

* ((int*)00x67a9)=0xaa66
发布了33 篇原创文章 · 获赞 4 · 访问量 2622

猜你喜欢

转载自blog.csdn.net/CNMNMSL1/article/details/104221486