当前位置:   article > 正文

嵌入式学习——1——C基础——5-数组_嵌入式c语言中的数组

嵌入式c语言中的数组

一、数组的定义

数组:使用连续的储存空间存储多个类型相同的构造类型

数据类型:基类型(int float)、构造类型(数组,结构体,共用体)、空类型(void)、指针类型

二、一维数组

1.一维数组的定义

  1. 1.全局变量未初始化默认结果为0
  2. 在main函数外定义的变量,全局
  3. 2.局部变量未初始化默认结果为随机值
  4. 在main函数内定义的变量,局部
  5. 3.全部初始化
  6. int arr[5]= {1,2,3,4,5};
  7. 4.部分初始化,默认剩余元素使用0填充
  8. int arr[5]= {1,2};
  9. int arr[5]= {0}; //对数组清0
  10. 5.单个数组元素初始化。默认剩余元素是随机值
  11. int arr[5];
  12. arr[0]=11;
  13. arr[1]=22;
  14. arr[3]=44;
  15. 6.省略数组长度初始化,默认数组长度是实际元素的个数
  16. int arr[5]={11,22,33,44,55};
  17. int arr[]={11,22,33,44,55};
  18. 7.对数组清0
  19. // memset:对字符初始化,可以对整数进行清0和-1
  20. 函数格式:
  21. #include <string.h>
  22. void *memset(void *s, int c, size_t n);
  23. 参数:
  24. void *s: 标识数组名
  25. int c : 初始化的值
  26. size_t n : 数组的字节大小
  27. 使用格式:
  28. int arr[5];
  29. memset(arr, 0, sizeof(arr)); //对数组清0
  30. // bzero: 专门清0
  31. 函数格式:
  32. #include <string.h>
  33. void bzero(void *s, size_t n);
  34. 参数:
  35. void *s: 表示数组名
  36. size_t n: 数组的字节大小
  37. 使用格式:
  38. int arr[5];
  39. bzero(arr, sizeof(arr));
  40. 8.错误初始化
  41. int arr[5];
  42. arr = {1,2,3,4,500}; //× arr:数组名表示数组的首地址
  43. arr[5]={11,22,33,44,55};//× arr[5]是一个值,且越界

2.一维数组的引用

  1. 1.一维数组下表从0开始,n个元素,下表的取值范围[0,n-1]
  2. 2.数组元素的引用
  3. arr[0] 第一个值
  4. arr[1] 第2个值
  5. 3.数组的越界访问
  6. 如果越界访问的内存没有被占用,可以访问,结果是随机值
  7. 如果越界访问的内存被占用,存储不重要数据,可以访问,结果随机值
  8. 如果越界访问的内存被占用,存储重要数据,不可以访问,结果 段错误
  9. 4.数组的循环引用
  10. int arr[5];
  11. int i;
  12. //循环输入
  13. for(i=0;i<5;i++)
  14. {
  15. scanf("%d",&arr[i]);
  16. }
  17. //循环输出
  18. for(i=0;i<5;i++)
  19. {
  20. printf("arr[%d]=%d\n",i,arr[i]);
  21. }

3.数组的地址

数组名表示数组的首地址,也就是第一个元素的地址

int arr[5];  arr===>&arr[0]

代码如下:

  1. {
  2. int arr[3]={11,22,33};
  3. //打印地址
  4. //arr+i-->&arr[i]--->&arr[0]+i
  5. for(int i=0;i<3;i++)
  6. {
  7. printf("%p\n",arr+i);
  8. printf("%p\n",&arr[i]);
  9. printf("%p\n",&arr[0]+i);
  10. }
  11. return 0;
  12. }

三、二维数组

1.二维数组的定义以及初始化

  1. 1.二维数组按行初始化
  2. int arr[2][3]={{11,22,33},{44,55,66}}; //全部初始化
  3. int arr[2][3]={{11,0,0},{44,55,0}}; //部分初始化,剩余元素使用0填充
  4. 2.二维数组按列初始化
  5. int arr[2][3]={11,22,33,44,55,66}; //全部初始化
  6. int arr[2][3]={11,22,0,0,0,0}; //全部初始化
  7. 3.二维数组省略第一维初始化
  8. int arr[][3]={11,22,33,44,55,66}; //全部初始化
  9. int arr[][3]={11,22,0}; //全部初始化 1
  10. int arr[][3]={{11},{33}}; //全部初始化 2
  11. 4.计算行和列
  12. int arr[][3]={11,22,33,44};
  13. int line=sizeof(a)/sizeof(a[0])
  14. int row=sizeof(a[0])/sizeof(a[0][0])
  15. 5.二维数组的错误初始化
  16. int arr[2][3];
  17. arr={11,22,33,44,5};
  18. arr[2][3]={11,22,33};

2.二维数组的引用

  1. 1.数组下表从0开始,m行n列:行[0,m-1] 列[0,n-1]
  2. 2.引用二维数组元素
  3. int arr[2][3]={11,22,33,44};
  4. arr[0][0]=11
  5. 23列:arr[1][2]
  6. 3.二维数组的循环引用
  7. //循环输入二位数组
  8. for(int i=0;i<line;i++)
  9. {
  10. for(int j=0;j<row;j++)
  11. {
  12. scanf("%d",&arr[i][j]);
  13. }
  14. }
  15. //循环引用二位数组
  16. for(int i=0;i<line;i++)
  17. {
  18. for(int j=0;j<row;j++)
  19. {
  20. printf("arr[%d][%d]=%d\n",i,j,arr[i][j]);
  21. }
  22. }
  23. 4.数组的越界访问
  24. 如果越界访问的内存没有被占用,可以访问,结果是随机值
  25. 如果越界访问的内存被占用,存储不重要数据,可以访问,结果随机值
  26. 如果越界访问的内存被占用,存储重要数据,不可以访问,结果 段错误

3.二维数组的地址

二维数组的地址是连续的

  1. int main(int argc, const char *argv[])
  2. {
  3. int arr[2][3];
  4. for(int i=0;i<2;i++)
  5. {
  6. for(int j=0;j<3;j++)
  7. {
  8. printf("%p\n",&arr[i][j]);
  9. }
  10. }
  11. return 0;
  12. }

四、一维字符数组

1.字符数组定义以及初始化

  1. 1.单字符初始化
  2. char str[5]={'a','b','c','d','e'}; //全部初始化
  3. char str[5]={'a','b','c'}; //部分初始化,剩余元素默认使用'\0'填充
  4. char str[]={'a','b','c'};//默认是实际字符的个数
  5. 2.字符串初始化,双引号引起来,计算机会默认添加\0
  6. char str[5]={"abcd"};//全部初始化
  7. char str[5]="abcd";//{}可有可无
  8. char str[5]={"ab"};//部分初始化,剩余元素默认使用'\0'填充
  9. char str[]="abcd"; //默认长度是5
  10. 3.错误初始化
  11. char str[5];str="abcd"; ×
  12. char str[5];str[5]="abcd"; ×

2.一维字符数组的引用

1.使用一维数组的循环引用

        char str[5]="abcd";

2.字符串的整体引用%s

        char str[5]="abcd"; //整体输入

        scanf("%s",str); //只有字符串的输入不加&         

        printf("%s",str);//%s格式控制符,打印字符串,遇到\0自动结束

3.字符数组长度和字符串长度的区别(面试)

字符数组长度:使用sizeof计算,计算\0

字符串长度:    使用strlen计算,不计算\0

字符数组长度

字符串长度

char a[]="abcd"

54

char b[]={'a','b','c'}

3随机

char d[10]={'a','b'}

102

char e[100]="abcd"

1004

char g[]="abc\0gh"

73

4.字符串函数

1.strlen

功能:计算字符串长度,不计算\0

格式:

         #include <string.h>

         <>:默认在系统库文件中查找 /usr/include

        "":现在当前目录下查找头文件,如果找不到在系统库文件中查找

        size_t strlen(const char *s);

参数:

         char *s:表示数组变量名

返回值:

         #define size_t unsigned long -->64位-->%ld %lu

         #define size_t unsigned int --->32位-->%d %u

         默认返回字符串长度

使用格式:

        char str[]="hello";

        strlen(str); // 5

        strlen("hello"); // 5

非函数实现:

         //非函数的实现方式

        size_t i=0;

         for(i=0;str[i]!='\0';i++);

         printf("i=%ld\n",i);

2.strcpy

功能:字符串拷贝,字符串赋值

函数格式:

         #include <string.h>

        char *strcpy(char *dest, const char *src);

参数:

         char *dest:目标字符串

        const char *src:源字符串

        把src字符串拷贝给dest,dest变,src不变

返回值:

        返回dest的首地址

使用格式:

        char a[]="hello";

        char b[10]=""

        strcpy(b,a);

        把a的值赋值给b

        strcpy(b,"hello");

//非函数实现字符串拷贝

        char dest[10]="12345678";

        char src[10]="abcd";

        int i;

        for(i=0;src[i]!='\0';i++) {

                dest[i]=src[i];

        }

        dest[i]='\0';

        puts(dest);

3.strcat

功能:字符串连接

  1. 格式:
  2. #include <string.h>
  3. char *strcat(char *dest, const char *src);
  4. 参数:
  5. char *dest:目标字符串
  6. const char *src:源字符串
  7. 把src连接到dest的后面,dest变,src不变
  8. 返回值:
  9. 返回dest的首地址
  10. 使用格式 :
  11. char a[20]="hello";
  12. char b[20]="world";
  13. strcat(a,b); //把b连接到a的后面
  14. strcat(a,"world");
  15. //非函数实现字符串链接
  16. char dest[20]="123456";
  17. char src[]="abcdef";
  18. //循环到dest的后面
  19. int i;
  20. for(i=0;dest[i]!='\0';i++);
  21. //循环src复制给dest
  22. int j;
  23. for(j=0;src[j]!='\0';j++)
  24. {
  25. dest[i++]=src[j];
  26. }
  27. dest[i]='\0';
  28. puts(dest);

4.strcmp

功能:字符串比较

  1. 格式:
  2. #include <string.h>
  3. int strcmp(const char *s1, const char *s2);
  4. 参数:
  5. const char *s1: 第一个字符数组变量名
  6. const char *s2: 第二个字符数组变量名
  7. 参数:
  8. int: 表示s1-s2的ASCII值
  9. 使用格式:
  10. char a[]="AB";
  11. char b[]="AB";
  12. a<b -->strcmp(a,b)<0 -->-32 if( strcmp(a,b)<0) if(a<b)
  13. a>b --->strcmp(a,b)>0 -->32
  14. a==b -->strcmp(a,b)==0--->0

五、二维字符数组

格式:存储类型 char 数组名[常量表达式1][常量表达式2]

常量表达式1:第一维,行,字符串的个数

常量表达式2:第二维,列,每个字符的字节大小

char a; //一个单字符

char b[10]; //10个单字符, 一个字符串

char str[3][5]; //3行5列 3个字符串,每个字符串5字节

  1. 1.单字符初始化
  2. char a[2][3]={{'A','B','C'},{'1','2','3'}}; 按行的全部初始化
  3. char a[2][3]={'A','B','C','1','2','3'}; 按列全部初始化
  4. char a[2][3]={'A','B','C','1'}; 部分初始化
  5. 2.字符串整体初始化
  6. char a[3][5]={"ABCD","1234","+-*/"};

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号