嵌入式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 指针与数组的复杂说明


右左法则:右左法则


相关文章
|
2月前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
79 1
|
8天前
|
存储 运维 Shell
运维.Linux.bash学习笔记.数组及其使用
运维.Linux.bash学习笔记.数组及其使用
14 0
|
2月前
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
82 1
|
27天前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
**嵌入式Linux学习误区摘要** 1. **过度聚焦桌面Linux** - 许多学习者误将大量时间用于精通桌面Linux系统(如RedHat、Fedora、Ubuntu),认为这是嵌入式Linux开发的基石。 - 实际上,桌面Linux仅作为开发工具和环境,目标不应是成为Linux服务器专家,而应专注于嵌入式开发工具和流程。 2. **盲目阅读Linux内核源码** - 初学者在不了解Linux基本知识时试图直接研读内核源码,这往往导致困惑和挫败感。 - 在具备一定嵌入式Linux开发经验后再有针对性地阅读源码,才能有效提升技能。
22 4
|
2月前
|
物联网 Linux 芯片
学习嵌入式是选择单片机还是Linux?
单片机通常指的是一种集成了处理器、存储器和各种外设接口的微控制器芯片,常见的有STC、51系列、AVR、ARM Cortex-M等。单片机具有低成本、低功耗、实时性强等特点,适用于对资源要求较低、功耗要求较低、实时性要求较高的嵌入式系统。学习单片机开发可以让您深入了解嵌入式系统的底层原理和硬件编程,对于对嵌入式系统底层开发感兴趣的人来说,是一个很好的选择。
58 4
|
2月前
|
消息中间件 安全 Java
【嵌入式软件工程师面经】Linux多进程与多线程
【嵌入式软件工程师面经】Linux多进程与多线程
35 1
|
2月前
|
存储 缓存 Unix
【嵌入式软件工程师面经】Linux文件IO
【嵌入式软件工程师面经】Linux文件IO
34 1
|
2月前
|
Shell Linux
linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
34 0
|
2月前
|
Shell Linux
linux shell脚本字符串 字段分隔符 存入数组 根据下标取值
linux shell脚本字符串 字段分隔符 存入数组 根据下标取值
32 0
|
3月前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
该文指出了学习嵌入式Linux开发的两个常见误区。一是过分专注于学习桌面或服务器版Linux,而非关注嵌入式开发本身,实际上只需熟悉基本操作即可。二是试图在没有基础的情况下直接阅读Linux内核源代码,这是不切实际的,应先建立基础知识再进行源码学习。文章还提到了在嵌入式系统中获取和处理屏幕数据的示例,包括使用gsnap工具将framebuffer数据转为图像,以及涉及的交叉编译过程。
30 0