一维数组(数组指针初探)

来源:互联网 发布:最喜欢的一句话知乎 编辑:程序博客网 时间:2024/05/22 17:40

本节主要讲一维数组,期间会提及数组指针,为后续学习铺垫。

数组首元素地址与数组地址的关系

先看下面一个例子

int main(){    int i = 0;    int a[10] = {1,2};   //其他初始化为    int b[10];    //a = b;    printf("a:%d, a+1:%d, &a:%d, &a+1:%d",a, a+1, &a, &a+1);    getchar();    return 0;}
输出结果如下:

分析

a是数组名,它表示数组首元素地址;&a表示数组地址;

数组首元素地址虽然在数值上等于数组地址,但他们是两个不同的概念;

从输出结果可以看出:a+1比a多4个字节;&a+1比&a多40个字节,这40个字节正好是数组a的长度。

结论:数据类型不一样。

 

一维数组的数据类型是什么

 

问题:怎样表达int a[10]这种数据类型?

数据类型分为基础、非基础,对于非基础数据类型,思考角度应该发生变化。

C语言中的数组有自己特定的类型

例:int  array[5] 的类型为int[5]

数组类型:

                 typedef  int(MYINT5)[5];

                 typedef  int(MYFLOAT10)[10];

数组定义:

                 MYINT5  iArray;

                 MYFLOAT10  fArray;

 

看下面一个例子

int main(){    typedef char(MYCHAR)[10];    MYCHAR cArray;    //相当于char cArray[10];    MYCHAR *cArrayP = NULL; //其实这是数组指针,这在后面会讲到。    cArray[0] = 'a';    cArray[1] = 'b';    cArrayP = &cArray;    printf("%c",**cArrayP);    printf("%c",*(*cArrayP+1)); //为了研究指针cArrayP的指向问题,以及它与数组cArray的关系,而做出了如下分析。    printf("\n");    printf("   cArrayP  :%d\n",cArrayP);    printf("  *cArrayP  :%d\n",*cArrayP);    printf("   cArray   :%d\n",cArray);    printf("*(&cArray)  :%d\n",*(&cArray));    printf("   cArrayP+1:%d\n",cArrayP+1);    printf("   cArray+9 :%d\n",cArray+9);     getchar();    return 0;}
说明:这里cArrayP是一个数组指针,这个在后面会专门说到。

输出结果如下:

分析(me)

画出栈区内存模型如下所示:

1.  前面已经讨论过了cArray是数组首元素地址,&cArray是数组地址,虽然他们在数值上是相等的,但他们是两个完全不同的概念。

2.  将数组cArray看成一个整体,它是一个变量,把这个变量的地址赋给cArrayP,*cArrayP自然就取得了这个变量,即cArray。

3.  cArray是数组首元素地址,*cArray即取得了数组首元素值。又由于cArray等价于*cArrayP,所以**cArrayP也就取得了数组首元素值。

4.  cArray+1是数组第二个元素的地址,*(cArray+1)即取得了该元素的值。同理,*cArrayP+1也是数组第二个元素的地址,于是*(*cArrayP+1)就取得了该元素的值。

5.  另外,指针cArrayP指向的数据类型是MYCHAR类型,它是一个拥有10个字节长度的字符数组,因而cArrayP+1自然也就指向下一个这样的数据类型,所以cArrayP+1的数值比cArrayP大10个字节长度。换句话说,就是cArrayP的步长是10。

结论:

    数组类型:主要是为了解决指针的步长。int [][10]    //4*10

 


0 0
原创粉丝点击