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对应字母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语言数组的概念及使用

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

(0)

相关推荐

  • 从头学习C语言之指针和数组

    目录 指针和数组: 示例: 总结 指针和数组: 数组名其实是数组第一个元素的地址. %p用来打印地址,为十六进制 &:取址操作符 如果用一个指针指向数组,应该怎么做呢? char *p; p=a;//语句1 p=&a[0];//语句2 指针的运算: 当指针指向数组元素的时候,我们可以对指针变量进行加减运算,这样做的意义相当于只想距离指针所在位置向前或向后第n个元素. 对比标准的下标法访问数组元素,这种使用指针进行间接访问的方法叫做指针法. 需要郑重强调的是:p+1并不是简单的将地址加1,二

  • c语言的指针数组详解

    指针如何指向数组,并读取数组中的元素: #include <stdio.h> int main() { int arr[3] = {1,2,3}; int *p; p = &arr[0];//此句也可以写成 p = arr: for(int i=0;i<3;i++) { printf("第%d个元素值为:%d\n",i,*(p+i)); /*应注意这里指针的定义类型:p+i并不是指p的地址+1, 而是偏移一个类型的字节数,这里的类型是int,所以偏移4个字节*

  • 详解C语言中的指针与数组的定义与使用

    指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 全局变量 内存映射 可以对内存的内容修改修改硬盘的内容 一般在数据库中经常使用 内存的分配与释放 c语言分配内存的方法 // malloc(需要分配的大小): 这里的分配的大小需要对齐的2的指数 void *mem = malloc(size); 释放内存 // 一般分配的内容都是在堆空间中的 //

  • C语言运用函数指针数组实现计算器功能

    本文实例为大家分享了C语言运用函数指针数组制作计算器的具体代码,供大家参考,具体内容如下 先来回顾一下概念: 指针数组 -- 存放指针的数组 函数指针 -- 存放函数地址的指针 函数指针数组 -- 存放函数指针的数组 接下来说说这次要制作的计算器的功能: 1.add -- 加法 2.sub -- 减法 3.mul -- 乘法 4.div -- 除法 0.exit -- 退出 具体来通过代码讲解: (1)首先写一个菜单程序,在运行程序时首先打印一次菜单. void menu() { printf(

  • C语言指针引用数组案例讲解

    前言:C语言中指针玩的是什么,是内存,要想学好指针的小伙伴们要先对数据在内存中是怎么玩的做一番了解~       当在程序中定义一个变量时,系统会根据其数据类型为其开辟内存空间,例如Visual C++为整型变量分配四个字节的空间,为单精度浮点型变量分配四个字节,为字符型变量分配一个字节,内存中每个字节都有自己独立且唯一的一个编号,这就是地址 ,如下图,系统为变量i分配了2000~2004的存储单元. _访问变量的方式_有如下图两种: 第一种直接访问方式,直接通过变量名访问,变量名与地址有一一对

  • C语言指针数组案例详解

    指针与数组是 C 语言中很重要的两个概念,它们之间有着密切的关系,利用这种 关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之 间的联系及在编程中的应用. 1.指针与数组的关系 当一个指针变量被初始化成数组名时,就说该指针变量指向了数组.如: char str[20], *ptr; ptr=str; ptr 被置为数组 str 的第一个元素的地址,因为数组名就是该数组的首地址, 也是数组第一个元素的地址.此时可以认为指针 ptr 就是数组 str(反之不成立), 这样原来对数

  • C语言 指针数组进阶详解

    目录 指针与数组中的sizeof与strlen sizeof strlen 数组名 1.一维数组 整型数组 字符数组 指针数组 2.二维数组 指针笔试题 笔试题1 笔试题2 笔试题3 笔试题4 笔试题5 前言:指针与数组的知识往往让我们无法给自己定位,似乎是懂了,但真的碰上了又一言难尽.接下来有一些关于指针与数组的知识和例题讲解,来看看你对指针和数组到底有多了解吧! 指针与数组中的sizeof与strlen sizeof sizeof值关注占用空间的大小,单位是字节,不关注元素的类型,是一个操作

  • C语言中指针和数组试题详解分析

    目录 数组题: 程序一(一维数组): 字符数组 程序二(字符数组): 程序三(字符数组): 程序四(字符数组): 程序五(字符数组): 二维数组 程序六( 二维数组): 指针题 程序七( 指针): 程序八( 指针): 程序九( 指针): 程序十( 指针): 程序十( 图): 程序十一( 指针): 程序十二( 指针): 程序十三( 指针): 指针 和 数组 试题解析 小编,在这里想说一下,c语言的最后一节 C预处理,可能还需要一些时间,因为小编,昨天才下载了虚拟机 和 linux 系统,还没开始安

  • C语言的数组与指针你了解吗

    目录 前言 一.数组的定义 二.数组空间的初始化 1. char数组赋值 2.char数组硬件开发规范 二.数组与指针 总结 前言 自学笔记,没有历史知识铺垫(省略百度部分)C语言数组的概念及使用 一.数组的定义 char a[n]; 注意:数组与指针非常相似 二者的区别: 数组为常量,约定禁止二次赋值,即数组不应该出现在=左侧,如:a="HelloWorld";数组在声明时,会申请一段连续的内存空间,指针不会数组元素为变量,标记可以修改指向任意内存(实际上会copy右侧变量/常量到左

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

    目录 前言 一.数组的定义 二.数组空间的初始化 1. char数组赋值 2.char数组硬件开发规范 二.数组与指针 总结 前言 自学笔记,没有历史知识铺垫(省略百度部分)C语言数组的概念及使用 一.数组的定义 char a[n]; 注意:数组与指针非常相似 二者的区别: 数组为常量,约定禁止二次赋值,即数组不应该出现在=左侧,如:a="HelloWorld";数组在声明时,会申请一段连续的内存空间,指针不会数组元素为变量,标记可以修改指向任意内存(实际上会copy右侧变量/常量到左

  • C语言中的数组和指针汇编代码分析实例

    今天看<程序员面试宝典>时偶然看到讲数组和指针的存取效率,闲着无聊,就自己写了段小代码,简单分析一下C语言背后的汇编,可能很多人只注重C语言,但在实际应用当中,当出现问题时,有时候还是通过分析汇编代码能够解决问题.本文只是为初学者,大牛可以飘过~ C源代码如下: 复制代码 代码如下: #include "stdafx.h" int main(int argc, char* argv[]) {        char a=1;        char c[] = "

  • 详解C语言中的函数、数组与指针

    1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:   函数是C语言代码的基本组成部分,它是一个小的模块,整个程序由很多个功能独立的模块(函数)组成.这就是程序设计的基本分化方法: (1) 写一个函数的关键: 函数定义:函数的定义是这个函数的实现,函数定义中包含了函数体,函数体中的代码段决定了这个函数的功能: 函数声明:函数声明也称函数原型声明,函数的原

  • 举例理解C语言二维数组的指针指向问题

    之前对数组的概念一直没有理解透彻,只觉得数组名就是个常量指针而已,用法和基本的指针差不多.所以当我尝试用二级指针去访问二维数组时,就经常会出错.下面就是刚开始写的一个错误的程序: #include <stdio.h> int main() { int iArray[2][3] = {{1,2,3},{4,5,6}}; int **pArray = NULL; pArray = iArray; printf("array[0][0] = %d\n", pArray[0][0]

  • C语言数组和指针的问题一道非常值得深思的笔试题

    最近笔试就遇到下面这道题,谁都不敢说自己的C/C++能有多精通,当然,工作一久,很多老毛病也就容易犯了,所以说,理论是真的很重要的,下面这道题,说实话还是挺基础的,虽然当时笔试被我给猜对了,但还是要深究一下具体的转换细节. 如题: #include <stdio.h> int main(void) { char *str[] = {"ab","cd","ef","gh","ij","k

  • C语言数组和指针,内存之间的关系

    首先论证一维数组和一级指针之前的关系,我们常常使用一级指针指针的方式访问一维数组,只有对内存的理解到位才能理解它们直接的关系. 1.数组名是数组的首地址 2.对数组名取地址得到的还是数组的首地址 3.数组的访问方式其实就是首地址+偏移的寻址访问 我们在程序中会定义很多变量,有基本类型和自定义类型在进行开发的时候我对内存的访问访问就是通过变量名赋值的方式读写内存但是如果你看到的直接变量的符号名你将不可能理解内存.每一种类型都有字节宽度,char 1字节 short 2字节 int 字节float

  • C语言的数组指针与函数指针详解

    目录 前言 函数指针语法 数组指针与指针数组 总结 前言 数组指针和函数指针都是C语言比较难的知识点,尤其是函数指针,并且函数指针在开发中有着巨大的作用. 函数指针语法 定义一个函数指针,并通过函数指针间接调用函数: int get_num(int a, int b) { return a + b; } int (*func)(int a, int b); //定义了一个函数指针func,它指向 返回值为int 参数为 int a, int b的函数 func = &get_num; //函数指

  • C语言深入分析数组指针和指针数组的应用

    目录 一.数组类型 二.定义数据类型 三.数组指针 四.指针数组 五.小结 一.数组类型 C语言中的数组有自己特定的类型 数组的类型由元素类型和数组大小共同决定 例:int array[5] 的类型为 int[5] 二.定义数据类型 C语言中通过 typedef 为数组类型重命名:typedef type(name)[size]; 数组类型: typedef int(AINT5)[5]; typedef float(AFLOAT10)[10]; 数组定义: AINT5 iArray; AFLOA

  • C语言零基础讲解指针和数组

    目录 一.指针和数组分析-上 1.数组的本质 2.指针的运算 3.指针的比较 4.小结 二.指针与数组分析-下 1.数组的访问方式 2.下标形式 VS 指针形式 3.a 和 &a 的区别 4.数组参数 5.小结 一.指针和数组分析-上 1.数组的本质 数组是一段连续的内存空间 数组的空间大小为 sizeof(array_type) * array_size 数组名可看做指向数组第一个元素的常量指针 下面看一段代码: #include <stdio.h> int main() { int

随机推荐