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

 更新时间:2021年08月26日 16:12:55   作者:宝全哥哥  
这篇文章主要介绍了C语言的数组与指针,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下,希望能给你带来帮助

前言

自学笔记,没有历史知识铺垫(省略百度部分)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对应字母A
    printf("读取结果:%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]:1
    printf("buf[0]:%d",buf[0]);
    unsigned char bufChar[10];
    unsigned char srcBufChar[100]={11,22,33,44};
    memcpy(bufChar,srcBufChar,10*sizeof(char));
    //bufChar:22
    printf("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语言数组的概念及使用

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • wchar_t,char,string,wstring之间的相互转换

    wchar_t,char,string,wstring之间的相互转换

    以下是对wchar_t,char,string,wstring之间的相互转换进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-09-09
  • 使用C语言实现三子棋小游戏

    使用C语言实现三子棋小游戏

    这篇文章主要为大家详细介绍了使用C语言实现三子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • c++ 获取数字字符串的子串数值性能示例分析

    c++ 获取数字字符串的子串数值性能示例分析

    这篇文章主要为大家介绍了c++ 获取数字字符串的子串数值示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 浅谈C++ 基类指针和子类指针的相互赋值

    浅谈C++ 基类指针和子类指针的相互赋值

    下面小编就为大家带来一篇浅谈C++ 基类指针和子类指针的相互赋值。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C语言实现从指定位置截取文件内容

    C语言实现从指定位置截取文件内容

    这篇文章主要为大家详细介绍了如何利用C语言实现从指定位置截取文件内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • C++高级数据结构之优先队列

    C++高级数据结构之优先队列

    这篇文章主要介绍了C++高级数据结构之优先队列,文章围绕主题的相关资料展开详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • C语言实现字符转unix时间戳的简单实例

    C语言实现字符转unix时间戳的简单实例

    下面小编就为大家带来一篇C语言实现字符转unix时间戳的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • C 语言注释和变量使用基础详解

    C 语言注释和变量使用基础详解

    这篇文章主要为大家介绍了C语言注释和变量使用示例基础详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 二叉查找树的插入,删除,查找

    二叉查找树的插入,删除,查找

    以下是对二叉查找树的插入与删除以及查找进行了详细的介绍,需要的朋友可以 过来参考下
    2013-09-09
  • C语言入门篇--初识C语言及数据类型

    C语言入门篇--初识C语言及数据类型

    本篇文章是c语言基础篇,主要为大家介绍了C语言的基本类型,为大家介绍了什么是C语言,希望可以帮助大家快速入门c语言的世界,更好的理解c语言
    2021-08-08

最新评论