的数组的定义是什么意思

如题所述

把具有相同数据类型的若干变量按有序的形式组织起来,
以便于程序处理,这些数据元素的集合就是数组,按照数组
元素的类型不同,可分为:数值数组、字符数组、指针数组
结构数组等各种类别。
数组说明的一般形式为:
类型说明符 数组名[常量表达式],......;
其中类型说明符可以是任一种基本数据类型或构造数据类型
数组名是定义的数组标识符。常量表达式表示数据元素的个
数,也就是数组的长度。
对数组类型的说明应注意:
1)数组的类型实际上是数组元素的取值类型。
2)数组名的书写应符合标识符的书写规范。
3)数组名不能与其他变量名相同。
4)常量表达式表示数组元素的个数,但是其下标从0开始计算
5)不能在方括号中用变量来表示元素的个数,但是可以用符号
常数或常量表达式。
6)允许在同一个类型说明中,说明多个数组和多个变量。
数组元素的表示方法
一般比较简单就是数组名[下标]来引用,先定义后用,如果
是小数的话,直接自动取整。
数组赋值分为:初始化赋值和动态赋值
初始化赋值一般形式为:
static 类型说明符 数组名[常量表达式]={值,值......};
static表示静态存储类型,c语言规定只有静态存储数组和外部数组
才可做初始化赋值。
c语言对数组的初始化赋值还有几个规定:
1)可以只给部分元素赋值。
2)只能给元素逐个赋值,不能给数组整体赋值。
3)如不给可初始化的数组赋初值,在在数组说明中,可以不给出数组
元素的个数。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-12-02

    从内存角度,是一片连续的内存空间 
    数组初始化:

    //在编译时明确指定全部元素为

    int a[10] = {0};//在程序运行时,重置内存块为0

    memset(a,0,sizeof(a));1234


    数组元素个数在初始化的时候可以明确指出也可以根据初始化列表元素个数确定。

      数据类型:固定大小内存块的别名

      指针类型:依赖于指针所指向的内存空间的大小

      C语言中的数组有自己特定的类型:由元素类型和数组长度决定 
      例:int array[5]的类型为int [5] 
      可以重命名数组类型,并用新的数组类型名命名数组变量,使用typedef关键字进行重命名

      typedef int (MYINT5)[5];//MYINT5表示一个含有5个元素的int类型的数组 MYINT5 array;//相当于int array[5];123


      数组名的技术盲点:

      数组首元素的地址和数组地址是两个不同的概念

      数组名代表数组首元素的地址,它是个常量

      变量本质是内存空间的别名,一定义数组,就分配内存,内存就固定了。所以数组名起名以后就不能被修改了。

      数组首元素的地址和数组的地址值相等,但只是值相等而已

      int a[10];

      printf("得到整个数组的地址a: %d \n", &a);

      printf("数组的首元素的地址a: %d \n", a);

    数组指针类型

    直接定义数组指针变量

    #include <stdio.h>

    #include <stdlib.h>

    #include <string.h>

    #define ARRAY_SIZE 5

    int main(void)

    {

    int i = 0;

    int (*p_array)[ARRAY_SIZE] = NULL;//告诉编译器 给我分配一个指针变量

    //直接定义一个数组指针,相当于int (*p_myArray)[5];

    int array[ARRAY_SIZE]={0};

    p_array = &array;//将指针变量指向数组类型的变量array,此时指针的步长是整个数组长度

    for(i= 0;i<ARRAY_SIZE;i++){

    (*p_array)[i] = 2*i+2;//通过指针操作数组内存空间

    }

    for(i= 0;i<ARRAY_SIZE;i++){

    printf("%d\n",(*p_array)[i]);

    }

    printf("Hello World!\n");

    return 0;

    }

    多维数组

    本质推演

    多维数组名就是一个数组指针变量,指向除了最高维以外的剩余维数的数组

    多维数组名是一个多级指针,取以后减少一级指针。同样的对于二级指针,取*以后变成一级指针,二级指针指向一块内存,常是一个数组,一级指针指向一个数组里面的元素。 
    n级指针的值和n-1级指针的值(就是地址相等)重合,拿二维数组来说,就是某一行整个行的地址(一个数组地址)和该行首元素的地址在相等,这是必然的,他们都是该片内存的起始位置,必然相等。但是他们的数据类型不一样。n级指针指向的内存块更多,n-1级指针指向的只是n级指针指向的内存块的一部分,常是其中的一个元素。 
    多维数组char a[i][j] ==> ((a+i)+j)转换技巧分析

    #define  _CRT_SECURE_NO_WARNINGS 

    #include <stdlib.h>

    #include <string.h>

    #include <stdio.h>

    void main()

    {

    int aaa[5][3];

    for (i = 0; i<5; i++)

    {

    for (j = 0; j < 3; j++)

    {

    aaa[i][j] = j + i + 1;

    }

    }

    for (i = 0; i<5; i++)

    {

    printf("\n");

    for (j = 0; j < 3; j++)

    {

    printf("aaa[%d][%d] = %d\t",i,j, aaa[i][j]);

    }

    printf("\n");

    }

    printf("aaa地址:%d\n", aaa);

    printf("aaa[0][0]地址:%d\n", &aaa[0][0]);

    printf("aaa+1地址:%d\n", aaa+1);

    printf("aaa[1][0]地址:%d\n", &aaa[1][0]);

    printf("*(aaa+1)地址:%d\n", *(aaa + 1));

    printf("*(aaa + 1)+1地址:%d\n", *(aaa + 1)+1);

    printf("aaa[1][1]地址:%d\n", &aaa[1][1]);

    printf("&aaa+1地址:%d\n", &aaa+1);

    printf("aaa[4][2]地址:%d\n", &aaa[4][2]);

    printf("hello...\n");

    system("pause");

    return;

    }

    运行结果

    /**************

    aaa[0][0] = 1   aaa[0][1] = 2   aaa[0][2] = 3

    aaa[1][0] = 2   aaa[1][1] = 3   aaa[1][2] = 4

    aaa[2][0] = 3   aaa[2][1] = 4   aaa[2][2] = 5

    aaa[3][0] = 4   aaa[3][1] = 5   aaa[3][2] = 6

    aaa[4][0] = 5   aaa[4][1] = 6   aaa[4][2] = 7

    aaa地址:14023660

    aaa[0][0]地址:14023660

    aaa+1地址:14023672

    aaa[1][0]地址:14023672

    *(aaa+1)地址:14023672

    *(aaa + 1)+1地址:14023676

    aaa[1][1]地址:14023676

    &aaa+1地址:14023720

    aaa[4][2]地址:14023716

    hello...

    请按任意键继续. . .

    ************************/

相似回答