嵌入式Linux C(七)——数组(详)

简介: 嵌入式Linux C(七)——数组(详)

一、数组


1.1 数组认知:


静态分配空间(int a[100] 400个字节)----->空间利用率太差(1.不够用 2. 浪费空间)

所占内存空间特点:连续的(物理连续) -->malloc分配空间不一定是物理连续(malloc实现原理:链表链接所有空闲的空间,组成最终分配的空间)


1.2 如何使用数组


定义数组:该定义多大?char src[1024]; -->柔性数组!!!

注意事项:可变长数组c99

c89:定义数组时。必须定义其长度;

注意事项:不能在使用过程中通过修改变量,来扩充数组的内存空间

(选择方式):通常用宏来表达数组的代销,提高代码移植性

定义数组时,要清零

int a[3] = {0}

memset(a,0,sizeof(a));


[] = *();

数组++;不行


//柔性数组
struct node
{
  int len;
  int array[0];
}
struct node n;
n.len = 10;
n.array = (int *)malloc(sizeof(int) * n.len);


数组的使用

数组名的作用:

一维数组名:指针常量(元素类型的指针,无法改变),保存的数组首元素的地址

void func(char src[100])//用数组接的话,会退化成指针:char *src,所以要用指针接
{
  printf("%ld",sizeof(src));//输出是8
  src++;
}
char buffer[1024] = "hello world";
func(buffer);


数组的地址



int a[3]
printf("&a + 1 = %p",&a)
//a:数组名,指针常量,保存数组首元素的地址
&a:对数组名取地址,等于数组的地址:
*(&a) = a;对一位数组的地址取值等于数组首元素的地址
整型变量的地址用整型指针变量保存,
字符变量的地址用字符指针变量保存,
数组变量的地址用数组指针变量保存,
数组指针变量:变量,保存的是地址,地址数组的地址是数组的地址
int (*pa)[3]  //整型数组指针变量:pa是一个变量,保存的地址,该地址是数组的地址,该数组是一个整型数组
pa = &a //*pa = a

0a2653c851af460fa595bd959398a8f1.png

二维数组

#include <stdio.h>
int main()
{
  int aa[2][2];
  //int aa[2][] = {1,2,3,4}  //二维数组只能省略列,不能省略行
  // 二维数组名
  //作用:
  for(int i = 0;i < 2; i++)
  {
  for(int j = 0;j < 2; j++)
  {
    scanf("%d",&aa[i][j]);
    scanf("%d",(*(aa + i) + j))
  }
  }
  for(int i = 0;i < 2; i++)
  {
  for(int j = 0;j < 2; j++)
  {
    printf("aa[%d][%d] = %d\n",i ,j ,aa[i][j]);
    printf("aa[%d][%d] = %d\n",i ,j ,*(*(aa + i) + j));
  }
  }
}

0a2653c851af460fa595bd959398a8f1.png

二维数组:

aa指针常量,保存的是首个一维数组的地址;

&aa:二维数组的地址

*(&aa) = aa;对二维数组的地址取值等于首个一维数组的地址

*aa:首个一位数组的首个元素的地址

0a2653c851af460fa595bd959398a8f1.png

二维数组名:指针常量(一维数组指针,保存首个一维数组的地址)


三维数组

int aaa[2][2][2] = {{1,2,3,4},{5,6,7,8}};
//第一个下标:第几个个二维数组
//第二个下标:第几个个二维数组第几行
//第三个下标:第几个个二维数组第几列
//aaa[1][1][0]是7
//*aaa:首个二维数组的首个一位数组的地址
//**aaa:首个二维数组的首个一维数组的首元素的地址
//***aaa:首个二维数组的首个一维数组的首元素的值
//&aaa:三维数组的地址
//*(&aaa):对三维数组的地址取值等于首个二维数组的地址

0a2653c851af460fa595bd959398a8f1.png


1.3 数组名


#include <stdio.h>
int main()
{
    char str[100];//"hello"
    char ktr[2][100];//"hello1""hello2"
    char ptr[3][2][100];//"hello3""hello4""hello5""hello6"
    printf("input str:\n");
    scanf("%s",str);
    printf("str = %s\n",str);
    printf("input ktr:\n");
    for(int i = 0; i < 2; i++)
    {
        //scanf("%s",*(ktr + i));
        scanf("%s",ktr[i]);
    }
    for(int i = 0; i < 2; i++)
    {
        printf("ktr[%d] = %s\n",i,*(ktr + i));
        //scanf("%s",ktr[i]);
    }
    printf("input ptr:\n");
    for(int i = 0; i < 2; i++)
    {
        for(int j = 0; j < 2; j++)
        {
            scanf("%s",*(*(ptr + i) + j));//ptr[i][j]
        }
    }
    for(int i = 0; i < 2; i++)
    {
        for(int j = 0; j < 2; j++)
        {
            printf("ptr = %s\n",*(*(ptr + i) + j));//ptr[i][j]
        }
    }
    return 0;
}


1.4 数组指针


数组指针变量


//数组指针
int (*paa)[2][2] = &aa;//数组指针变量:指向一个二维数组(保存二维数组地址)
int (*paaa)[2][2][3] = &aaa


如何定义数字组指针变量?右左法则 int (*p)

一维数组名,用指针接

void print2( char *str)

二维数组名,用一维数组指针接

void print2( char (*ktr)[100])

三维数组名,用二维数组数组指针接

void print2( char (*ptr)[2][100])


1.5 指针数组


指针数组:数组里保存的都是指针


#include <stdio.h>
int main()
{
    int *pi[3];//指针数组,存放
    //int (*pa)[3];//数组指针,是指针,指向数组,sizeof(pa) = 8
    char *pc[3] = 
}


一维数组名,用元素指针接,而元素就是指针,则就是元素指针的指针来接,即二级指针

void print4(char **pc)


1.6 指针与数组的区别


空间分配:指针:动态,数组:静态(优缺点)

访问效率:数组 > 指针 指针更灵活

安全性:数组高

函数形参:数组全都退化成指针


1.7 指针与数组的复杂说明


右左法则:右左法则


相关文章
|
5月前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
126 1
|
5月前
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
167 1
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
102 3
|
3月前
|
传感器 人工智能 网络协议
:嵌入式 Linux 及其用途
【8月更文挑战第24天】
180 0
|
4月前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
**嵌入式Linux学习误区摘要** 1. **过度聚焦桌面Linux** - 许多学习者误将大量时间用于精通桌面Linux系统(如RedHat、Fedora、Ubuntu),认为这是嵌入式Linux开发的基石。 - 实际上,桌面Linux仅作为开发工具和环境,目标不应是成为Linux服务器专家,而应专注于嵌入式开发工具和流程。 2. **盲目阅读Linux内核源码** - 初学者在不了解Linux基本知识时试图直接研读内核源码,这往往导致困惑和挫败感。 - 在具备一定嵌入式Linux开发经验后再有针对性地阅读源码,才能有效提升技能。
|
3月前
|
存储 运维 Shell
运维.Linux.bash学习笔记.数组及其使用
运维.Linux.bash学习笔记.数组及其使用
36 0
|
5月前
|
物联网 Linux 芯片
学习嵌入式是选择单片机还是Linux?
单片机通常指的是一种集成了处理器、存储器和各种外设接口的微控制器芯片,常见的有STC、51系列、AVR、ARM Cortex-M等。单片机具有低成本、低功耗、实时性强等特点,适用于对资源要求较低、功耗要求较低、实时性要求较高的嵌入式系统。学习单片机开发可以让您深入了解嵌入式系统的底层原理和硬件编程,对于对嵌入式系统底层开发感兴趣的人来说,是一个很好的选择。
138 4
|
5月前
|
消息中间件 安全 Java
【嵌入式软件工程师面经】Linux多进程与多线程
【嵌入式软件工程师面经】Linux多进程与多线程
69 1
|
5月前
|
存储 缓存 Unix
【嵌入式软件工程师面经】Linux文件IO
【嵌入式软件工程师面经】Linux文件IO
50 1
|
5月前
|
Shell Linux
linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
52 0
下一篇
无影云桌面