嵌入式day08
指针数组
所谓指针数组是指
由若干个具有相同存储类型和数据类型的指针变量构成集合
形式:<存储类型> <数据类型> *<指针数组名>[大小]
指针数组名表示该数组指针数组的起始地址
![](https://img.haomeiwen.com/i14300434/90f47ae01c014b25.png)
![](https://img.haomeiwen.com/i14300434/cbceb2faea4c47cd.png)
![](https://img.haomeiwen.com/i14300434/f8cc70a09aaf5580.png)
多级指针
多级指针的定义:
把一个指向指针变量的指针变量,称为多级指针变量
对于指向处理数据的指针变量称为一级指针变量,简称一级指针,而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针
二级指针变量的说明形式如下
<存储类型> <数据类型> **<指针名>;
多级指针的运算
指针变量加1,是向地址大的方向移动一个目标数据。多级指针运算也是以其目标变量为单位进行偏移。
![](https://img.haomeiwen.com/i14300434/e29ff5424e181457.png)
#include<stdio.h>
int main(int argc, char *argv[])
{
int a[] = {3, 6, 9};
int *p[2] = {&a[0], &a[1]};
int **q;
q = p;
printf("%d %d\n", a[0], a[1]);
printf("%d %d\n", *p[0], *p[1]);
printf("%d %d %d\n", a[0], *p[0], **q);
printf("%d %d %d\n", a[1], *p[1], **(q+1));
return 0;
}
结果:
![](https://img.haomeiwen.com/i14300434/2e06b81ce9d659bf.png)
void 指针
void指针是一种不确定数据类型的指针变量,它可以通过强制类型转换让该变量指向任何数据类型的变量
一般形式:void *<指针变量名称>;
对于void指针,在没有强制类型转换之前,不能进行任何指针的算术运算
![](https://img.haomeiwen.com/i14300434/2c713ddbca72ece8.png)
const变量
一般形式:const <数据类型> 变量名 = [<表达式>];
常量化变量是为了使得变量的值不能修改
变量有const修饰时,若想用指针间接访问变量,指针也要有const修饰。
常量化指针目标是限制通过指针改变其目标的数值,但<指针变量>存储的地址值可以修改
const修饰指针
形式:const <数据类型> *<指针变量名称>[= <指针运算表达式>]
![](https://img.haomeiwen.com/i14300434/52e3fd062496890b.png)
函数的基本用法
函数是一个完成特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值。
一般形式:
<数据类型> <函数名称>(<形式参数说明>)
{
语句序列;
return[(<表达式>)];
}
<数据类型>是整个函数的返回值类型。return[(<表达式>)]语句中表达式的值,要和函数的<数据类型>保持一致。如无返回值应该写为void型
<形式参数说明>是逗号","分隔的多个变量的说明形式
大括号对{<语句序列>},称为函数体;<语句序列>是大于等于零个语句构成的
函数的说明就是指函数原型,其中<形式参数说明>可以缺省说明的变量名称,但类型不能缺省
函数的使用也叫函数的调用,形式:
函数名称(<实际参数>)
,实参就是在使用函数时,调用函数传递给被调用函数的数据。需要确切的数据
函数调用可以作为一个运算量出现在表达式中,也可以单独形成一个语句。对于无返回值的函数来讲,只能形成一个函数调用语句。
![](https://img.haomeiwen.com/i14300434/51d2d07720397846.png)
练习定义求x的n次方值的函数?
源码:
#include<stdio.h>
float Caculate(int n, float x)
{
float s=1;
int i=0;
while(i < n){
s *=x;
i++;
}
return s;
}
int main(void)
{
int a;
float b, s;
scanf("%f", &b);
scanf("%d", &a);
s = Caculate(a,b);
printf("%f\n", s);
return 0;
}
![](https://img.haomeiwen.com/i14300434/4f2c7bdbf1d5c656.png)
C语言控制语句
函数的参数传递
函数之间的参数传递方式:
-
全局变量
-
复制传递方式
-
地址传递方式
全局变量
全局变量就是在函数体外说明的变量,在程序中的每个函数里都是可见的
全局变量一经定以后就会在程序的任何地方可见。函数调用的位置不同,程序的执行结果可能会受到影响。不建议使用。
复制传递方式
调用函数将实参传递给被调用函数,被调用函数将创建同类型的形参并用实参初始化
形参是新开辟的存储空间,因此,在函数中改变形参的值,不会影响到实参
地址传递方式
按地址传递,实参为变量的地址,而形参为同类型的指针
被调用函数中对形参的操作,将直接改变实参的值(被调用函数对指针的目标操作,相当于对实参本身的操作)
![](https://img.haomeiwen.com/i14300434/690ef0d871f0211c.png)
编写一个函数,统计字符串中小写字母的个数,并把字符串中的小写字母转化成大写字母
#include<stdio.h>
int str_fun(char *p);
int main(int argc, char argv[])
{
char s[] = "ghjkkh3459hj";
int n;
n = str_fun(s);
printf("%d %s\n", n, s);
return 0;
}
int str_fun(char *p)
{
int c = 0;
while(*p){
if(*p <= 'z' && *p >= 'a'){
c++;
*p -= 32;
}
p++;
}
return c;
}
![](https://img.haomeiwen.com/i14300434/0a153202c4b28709.png)