C语言的数组与指针可以这样了解

目录

  • 前言
  • 一、数组的定义
  • 二、数组空间的初始化
    • 1. char数组赋值
    • 2.char数组硬件开发规范
  • 二、数组与指针
    • 总结

      前言 自学笔记,没有历史知识铺垫(省略百度部分)C语言数组的概念及使用

      一、数组的定义
      char a[n];
      注意:数组与指针非常相似
      二者的区别:
      数组为常量,约定禁止二次赋值,即数组不应该出现在=左侧,如:a="HelloWorld"; 数组在声明时,会申请一段连续的内存空间,指针不会数组元素为变量,标记可以修改指向任意内存(实际上会copy右侧变量/常量到左侧数组元素变量中,产生两份内存,如a[2]="HelloWorld"; ),而指针指向常量后,再指向其他常量会产生段错误异常 二者相同点:
      C语言数组没有越界问题,甚至可以a[-3]写法,数组和指针都可以访问任意内存地址的内容
      int main(int argc, char **argv){char a4 = 'A'; char a[2] = {'B', 'C'}; char a3 = 'D'; //读取结果:41 ASCII中 16位的41对应字母Aprintf("读取结果:%X", a[2]); return 0; }


      二、数组空间的初始化
      1. char数组赋值
      char buf[10]={'A','B'}; 等价于 char buf[]={'A','B'}; ,前者数组长度为10,可在10范围内增减,后者数组长度为声明时数组当前的长度2,根据实际情况选择,后续同原理
      注意:上述赋值可以作为普通字符内存使用,不能当作字符串使用,如果当作字符串,需要如下赋值
      char buf[3]={'A','B','\0'};
      char buf[3]={"ab"};
      注意:上述赋值可以作为字符串使用,但不能作为普通字符内存使用,默认会多出\0
      char buf[3]="ab";
      注意:上述操作意义为:将右侧的常量从常量区copy一份到左侧的变量区,该操作会产生两个存储"ab"内存
      右侧"ab"是常量不可修改,左侧buf变量的"ab"是可以修改的

      2.char数组硬件开发规范
      char buf[10]; 表示存储的字符/字符串(最后一位为\0)unsigned char buf[10]; 表示交互普通数据(最高位可以用于数据操作,粒度为bit)嵌入式开发中禁止使用strcpy(); 函数(必须找到\0才会结束,有漏洞),copy可以使用strncpy(); ,内存copy可以使用memcpy();
      拷贝三要素
      srcdest个数
      注意:内存copy
      int main(){int buf[10]; int srcBuf[100]={1,2,3,4,5}; memcpy(buf,srcBuf,10*sizeof(int)); //buf[0]:1printf("buf[0]:%d",buf[0]); unsigned char bufChar[10]; unsigned char srcBufChar[100]={11,22,33,44}; memcpy(bufChar,srcBufChar,10*sizeof(char)); //bufChar:22printf("bufChar:%d",bufChar[1]); return 0; }


      二、数组与指针
      注意:
      1.指针的修饰符修饰的是指针一次读取的数量
      2.当指针指向多维数组时,只通过int就无法满足要求,如int b[3][4],表示每行b[n]都存储了sizeof(int)*4个字节,指针定义时也需要做对应的读取数量调整,int (*p)[4]才能满足,此处的()必须添加,让编译器优先读取*p,再通过int修饰符和[]识别指针的容量为sizeof(int)*4个字节
      3.多维数组概念一致
      int main(){int a[10]; int b[3][4]; int c[3][4][5]; int *p1 = a; int(*p2)[4] = b; int(*p3)[4][5] = c; return 0; }


      总结 本章主要为C语言数组的概念及使用
      【C语言的数组与指针可以这样了解】本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

        推荐阅读