精华内容
下载资源
问答
  • C语言中的数组值得注意的地方有以下两C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。然而,C语言数组的元素可以是任何类型的对象,当然也可以是另外一个数组。这样,要“仿真”出...
  • C语言中的数组值得注意的地方有以下两C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。然而,C语言数组的元素可以是任何类型的对象,当然也可以是另外一个数组。这样,要“仿真”出...

    语言中指针与数组这两个概念之间的联系是密不可分的,以至于如果不能理解一个概念,就无法彻底理解另一个概念。

    C语言中的数组值得注意的地方有以下两点:

    C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。然而,C语言中数组的元素可以是任何类型的对象,当然也可以是另外一个数组。这样,要“仿真”出一个多维数组就不是一件难事。

    对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其他有关数组的操作,哪怕它们看上去是以数组下标进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。

    一旦我们彻底弄懂了这两点以及它们所隐含的意思,那么理解C语言的数组运算就不过是“小菜一碟”。如果不清楚上述两点内容,那么C语言数组运算就可能会给编程者带来许多困惑。需要特别指出的是,编程者应该具备将数组运算与它们对应的指针运算融汇贯通的能力,在思考有关问题时大脑中对这两种运算能够自如切换。毫无滞碍。

    任何程序设计语言中都内建有索引运算,在C语言中索引运算是以指针算术的形式来定义的。

    如何声明一个数组

    要理解C语言中数组的运作机制,我们首先必须理解如何声明一个数组,例如:

    int a[3];

    这个语句声明了a是一个拥有了3个整型元素的数组,类似的,

    struct{

    int p[4];

    double x;

    }b[17];

    声明了b是一个拥有17个元素的数组,其中每个元素都是一个结构,该结构中包括了一个拥有4个整形元素的数组(命名为p)和一个双精度类型的变量(命名为x)。

    现在考虑下面的例子:

    int calendar[12][31];

    这个语句声明了calendar是一个数组,该数组拥有12个数组类型的元素,其中每个元素都是拥有31个整型元素的数组(而不是一个拥有31个数组类型的元素的数组,其中每个元素又是一个拥有12个整型数组元素的数组)因此sizeof(calendar)的值是372(31*12)与sizeof(int)的乘积。

    如果calendar不是用于sizeof的操作数,而是用于其他的场合,那么calendar总是被替换成一个指向calendar数组的起始元素的指针。要理解上面这句话的含义,我们首先必须理解有关指针的一些细节。

    二维数组模拟*a即数组a中下标为0的元素的引用。例如,我们可以这样写:

    *a=84;

    这个语句将数组a中下标为0的元素的值设置为84.同样道理,*(a+1)数组a中下标为1的的元素的引用,以此类推,概而言之,*(a+i)即数组中下标为i的元素的引用,这种写法是如此常用,因此被简记为a[i].

    正是这一概念让C语言新手难于理解,实际上,由于a+i与i+a的含义一样,因此a[i]和i[a]也具有同样的含义。也许某些汇编语言程序员会发现后一种写法很熟悉,但我们绝对不推荐这种写法。

    现在我们可以考虑二维数组了,正如前面所讨论的,它实际上是以数组为元素的数组,尽管我们也可以完全依据指针编写操纵一维数组的程序,这样做在一维情形下并不困难,但是对于二维数组从记法上的便利性来说采用下述形式就几乎是不可替代了。还有,如果我们仅仅使用指针来操纵二维数组,我们将不得不与C语言中最为“晦暗不明”的部分打交道,并常常遭遇到潜伏着的编译器bug。

    让我们回过头来再看几个声明:

    int calendar[12][31];

    int *p

    int i;

    然后考一考自己,calendar[4]的含义是什么?

    因为calendar是一个有着12个数组类型元素的数组,它的每个数组类型元素又是一个有着31个整型数组,所以calendar[4]是 calendar数组的第五个元素,是calendar数组中12个有着31个整型元素的数组之一,因此calendar[4]的行为也就表现一个有着31个整形元素的数组的行为,例如sizeof(calendar[4])的结果是31与sizeof(int)的乘积。

    p=calendar[4];

    这个语句使指针p指向了数组calendar[4]中下标为0的元素。如果calendar[4]是一个数组,我们当然可以通过下标的形式来指定这个数组中的元素,就像下面这样:

    i = calendar[4][7];

    我们确实也可以这样做。还是与前面类似的道理,这个语句可以写成下面这样而表达式的意思保持不变:

    i = *(calendar[4]+7);

    这个语句还可以进一步写成:

    i = *(*(calendar+4)+7);

    从这里我们不难发现,用方括号的下标形式很明显地要比指针来表达简便得多。下面我们再看:

    p = calendar;

    这个语句是非法的,因为calendar是一个二维数组,即数组的数组,在此处的上下文中使用calendar名称会将其转化为一个指向数组的指针,而p是一个指向整型变量的指针,这个语句试图将一个类型的指针赋值给另一种类型的指针,所以是非法的。

    很显然,我们需要一种声明指向数组的指针的方法,经过了前面对类似问题不厌其烦的讨论,构造出下面的语句应该不需要废多大力气:

    int (*ap)[31];

    这个语句的效果是,声明了*ap是一个拥有三十一个整型元素的数组ap就是一个指向这样的数组的指针,因而我们可以这样写:

    int(*monthp)[31];

    Monthp = calendar;

    这样,monthp将指向数组calendar的第一个元素,也就是数组calendar的12个有着31个元素的数组类型元素之一。

    假定在新的一年开始时,我们需要清空calendar数组,用下标形式可以很容易做到:

    int month;

    for(month=0;month < 12;month++){

    int day;

    for(day=0; day < 31;day++)

    calendar[month][day]=0;

    }

    上面的代码段如果才用指针应该如何表示呢?我们很容易地把 calendar[month][day]=0; 表示为*(*(calendar+month)+day)=0;

    但是真正有关的部分是哪些呢?

    如果指针monthp指向一个拥有31个整型元素的数组,而calendar的元素也是一个拥有31个整型元素的数组,因此就像是在其他情况中我们可以使用一个指针遍历一个数组一样,这里我们同样可以使用指针monthp以步进的方式遍历数组calendar:

    int (*monthp)[31];

    for(monthp=calendar;monthp < &calendar[12];monthp++){

    int *dayp;

    for(dayp=*monthp;dayp < &(*monthp)[31];dayp++)

    *dayp=0;

    }

    展开全文
  • c语言数组

    2018-12-23 15:34:31
    2丶注意点  1在创建数组时,必须定义数组的类型和大小。  数组的大小不能为0。  2在数组a[n]中,[ ]内必须为常量,不能为变量。  3输入数组时,可以使用循环语句。例如 for(int i=1;i&lt;n+1;i++) cin&...

    c语言数组

    一丶知识点

    (一)一维数组

    1丶形式

       数组名[下标]

       型如a[n]。

    2丶注意点

      1在创建数组时,必须定义数组的类型和大小。

      数组的大小不能为0。

      2在数组a[n]中,[ ]内必须为常量,不能为变量。

      3输入数组时,可以使用循环语句。例如

    for(int i=1;i<n+1;i++)

    cin>>a[i];

      4数组必须先定义,在使用。

      5数组不能进行赋值操作,如果声明int a[n],b[n]。是不能b=a。

      6 memset(a,0,sizeof(a))的作用是把数组a清零,他在cstring中定义。

    (二)二维数组

    1丶形式

       数组名[下标1][下标2]

       型如a[i][j]

    2丶注意点

       1二维数组与一维数组相类似。

        在创建数组时,必须定义数组的类型和大小。

      数组的大小不能为0。

      2在数组a[n][b]中,[ ]内必须为常量,不能为变量。

      3输入数组时,可以使用循环语句。例如

    for(int i=1;i<n+1;i++)

    for(int j=1;j<b+1;j++)

    cin>>a[i][j];

      4数组必须先定义,在使用。

      5回文

    回文是指从左到右和从右到左读一串字符的值都是一样的。

    (三)字符类型与字符数组

     1丶字符类型

       1字符类型由一个字符组成的字符常量和字符变量。

       2字符常量的定义

         const

              字符常量='字符'

       3字符变量定义

         char 字符变量。

     2丶字符数组

       1字符数组的定义格式

         char ch[n];

         注意

          字符数组的定义同于一般数组,所不同的是数组类型是字符型,第一个元素同样是从char[0]开始的。

       3丶字符串的输入与输出

         1输入

           格式scanf("%s",字符串名称);

           注意,这里的输入不加&

                 输入多组字符串时,以空格隔开。

           格式get(字符串名称)

           注意,get只能输入一个字符串。

          2输出

            格式printf("%s",字符串名称);

            注意,用%s输出时,输出项只能是字符串名称。

    二丶应用

    学习一维数组,二维数组等可

    展开全文
  • 当我们初学数组,字符串,指针时,容易弄混其名称的作用,例如以下程序: #include<stdio.h> ...a表示的整个数组的起始地址。只是恰好他们表示的地址相等,但并不能说他们两个就完全相等。 #

    当我们初学数组,字符串,指针时,容易弄混其名称的作用,例如以下程序:

    #include<stdio.h>
    int main()
    {
        int a[10];
        printf("%d",a);
        getchar();
        return 0;
    }
    

    此时输出结果为该数组名指向数组首元素的地址,但不能与指针混为一谈。此时可以注意a与&a的区别。a表示的是a[0]的起始地址,而&a表示的整个数组的起始地址。只是恰好他们表示的地址相等,但并不能说他们两个就完全相等。

    #include<stdio.h>
    
    int main()
    {
        int a[10];
        printf("%d",a[10]);
        getchar();
        return 0;
    }
    
    

    此时数组内没有储存数据,不同版本编译器可能输出不同结果,比如笔者的输出结果为1,有的可能时随机数字。

    展开全文
  • C语言数组

    2018-12-23 22:28:57
    一.数组的特点是: 1.数组是相同数据类型的元素的集合 2.数组中的各元素的存储是有先后顺序的,它们在...数组类型应注意以下几数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类...

    一.数组的特点是:
    1.数组是相同数据类型的元素的集合
    2.数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起
    3.数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,以此类推。
    二.数组类型应注意以下几点:

    1. 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
    2. 数组名的书写规则应符合标识符的书写规定。
    3. 数组名不能与其它变量名相同。例如:int a;float a[10];是错误的。
    4. 方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0], a[1], a[2], a[3], a[4]。
    5. 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。例如:
      #define FD 5 // … int a[3+2],b[7+FD];是合法的。但是下述说明方式是错误的。int n=5;int a[n];
      三 .数组分为两种:一维数组和二维数组。
      四.从学了数组以后,当我们定义很多个变量分别取变量名就不麻烦了。并且在生活中使用数组可以使商品等分类清楚明了,便于我们管理,数组也一样,相同类型的一类数据。对以后的编程有很大帮助。
    展开全文
  • C语言数组与指针学习总结

    千次阅读 2017-02-25 00:23:32
    工作之后最害怕的是对最基础知识的考查,因此还是有必要随时回炉学习,温故知新。今天再次回顾总结一下C语言数组...然而,C语言数组的元素可以是任意对象,包括数组。这样就给多维数组的实现或者仿真提供了可能。  
  • 1.数组的含义: 数组就是一堆相同类型数据的...注意:数组定义时必须规定数组的长度。 3.数组的典型应用 uchar a,b,c,d,e,f; uchar niu[4]={3,6,21}; a=niu[0]; //3 数组元素下标从0开始 b=niu[1]; // 6...
  • ALIST是一段基于C语言的数组型双向链表处理代码,接口简单明了,易于使用,标准C语言开发,可添加在任何C/C++语言工程中,需要注意的是,如果使用了操作系统,请自行在库中修改指向处添加资源锁定,避免因操作系统...
  • C语言数组的相关运算

    2018-04-15 13:33:25
    关于数组的运算,需要注意以下几: 1.sizeof(数组名):数组名表示整个数组 sizeof(数组名)计算的是整个数组的大小,单位是字节 2.&数组名:数组名表示整个数组 &数组名取的是数组的地址,这里的...
  • 定义比较简单,有几说明必须要注意: 几重要的说明 数组名的命名规则与变量名命名规则相同; 常量表达式的值代表数组元素的个数; 一个数组的所有元素是同种类型的一组变量;比如float b[10]中,b[0],b[1],b[2]...
  • = = = ... C语言数组与指针学习总结【摘,有改动】 ...工作之后最害怕是对最基础知识考查,因此还是有必要随时回炉学习,温故知新。今天再次回顾总结一下C语言数组相关知识。... C语言数组值得注意的有两: ...
  • C语言数组总结与反思

    千次阅读 2018-12-20 10:50:56
    数组有一维数组,二维数组等,要注意数组的下标都是从0开始的,在做题时还要注意定义数组的大小,数组过小,在程序中会造成越界导致崩溃(多次崩溃深有体触),二维数组注意第二维度的长度绝对不能省略,若要把一个...
  • //const_n 是一个常量表达式,用来指定数组的大小 int arr1[] = {1,2,3,4}; int arr2[5] = {1,2,3,4,5}; int arr3[2]={0}; //不完全初始化 注意:如果创建数组时,不想直接指定元素个数,就得进行初始化. *2.数组...
  • int a[5]={1,2,3,4,5}; int *p=(int *)(a+1); int *ptr=(int *)(&a+1);   ... 上述三行代码得出指针p和ptr值是不一样: ... (2)&a+1是以步长为整个数组(5个int大小,这里是20字节)
  • 数组注意点: 未赋值全局变量都是为0,未赋值局部变量都是随机值。 如果定义时没有整体初始化,那么在后续就不能对数组进行整体初始化,只能单个元素地赋值。 当数组名作用于sizeof()时,那么数组名就是代表数组...
  • 关于数组的模糊注意:创建数组的时候后面创建的大小跟后来数组中的下标的表示总是感觉有些混乱 一、在进行定义数组大小的时候,里面的值如: int a[10]:表示定义了一个数组,而且这个数组的大小为10,这个代表...
  • 这个算是开发中小技巧了,也不知道如何起标题。 通常为了节省单片机引脚,我我们同城会使用比较多数字电路来扩展,比如74hc574D触发器,74ls13838译码器,3态...这里有两比较值得注意的, 1、很多时...
  • #pragma mark 二维数组-注意点 ###pragma mark 概念 /** // 注意点:每个一维数组 的元素个数不能省略 */ ###pragma mark 代码 #include <stdio.h> int main() ... // 1.二维数组的多种初...
  • 数组的注意点

    2015-12-18 21:38:35
    // // main.c // C语言学习 #include int main(int argc, const char * argv[]) { char nums[2] = {1,5}; ... char values[3] = {7,8,9... //注意点:在使用数组的时候,一定不要访问不属于字节的存储空间,这样会导
  • C语言中的数组值得注意的地方有以下两: 1. C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。然而,C语言数组的元素可以是任何类型的对象,当然也可以是另外一个数组。  这样,要...
  • C语言数组

    2016-01-14 19:28:00
    数组的注意点:  1.数组的类型一旦确定,那么存储的数据,就必须都是此类型的数据 int array[10]; //只能存储int 类型的数据  2.数组的长度固定,长度就是存储数据的个数.在我们创建数组的时候,就指定了数组...
  • C语言数组的初始化

    2015-03-28 15:31:49
    C语言中,数组的初始化有以下几种方式:  1. 定义的时候同时初始化:  int array[10] = {1,2,3,4,5};  2.... int array[] = {1,2,3,4,5};...注意点: 定义变量时必须制定数组的大小. 此时只能对数组变量成员
  • C语言的数组和指针一直是两个容易混淆东西,当初在学习时候,也许为了通过考试会对指针和数组一些考点进行突击,但是很多极其细节东西也许并不是那么清楚。本篇侧重点在于分析数组与指针关系,什么时候...
  • C语言一维数组的定义

    千次阅读 2016-11-03 22:21:41
    一维数组的定义方式  在C语言中使用数组必须先进行定义。一维数组的定义方式为: ... 对于数组类型说明应注意以下几: 1) 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类
  • 4. 23 C语言数组

    2015-05-20 00:50:27
    2、什么字符用于标识一个字符串结束,使用时需要注意什么?两种赋值字符串形式是否都需要显式加上末端字符?  字符串中字符逐个存放在数组元素中,以字符 '\0' 作为字符串结束标志。 
  • C语言数组名和数组下标

    千次阅读 2019-04-11 20:55:39
    数组注意点: 1.C数组中只有一维数组,数组的大小必须在编译期作为常数确定。但C数组的元素可以是任何类型的对象,当然也可以是另一个数组,所以“仿真”出一个多维数组。(不太明白为什么要强调只有一维数组,难道...
  • 1. 数组与指针: 对于数组,需要注意:1, C语言中只有一维数组, 而且数组的大小必须在编译期就作为一个常数确定下来; 2. 对于一个数组,我们只能做两件事:确定数组的大小 和 获得指向该数组下标为0的元素的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 532
精华内容 212
关键字:

c语言数组的注意点

c语言 订阅