一维数组与二维数组

问题研究

  1. 数组维度的联系??
  2. 相邻维度数组的关系?

要点:

  • a = &a[0] = &a[0][0]
    a表示这个二维数组的首地址
    &a[0]表示的是这个二维数组第一维的首地址
    &a[0][0]表示的是这个二维数组第一维第一个元素的地址。
    这三个地址是相同的。
    就好像一个班的位置,第一个位置,和第一排的第一个位置,以及第一排一号的位置指的是同一个位置一样。
    但是
    *a表示第一维首地址
    **a表示第一维首地址所保存的元素
    *(&a[0])表示的也是第一维首地址
    **(&a[0])表示的也是第一维首地址保存的元素
  • 在C中,二维数组可以看成是多个一维数组叠加构成的,如:
    int a[3][4]; //就可以看成是3个具有4个元素的一维数组叠加而成
    那么,a[0]就是第0行元素的地址,a[1]即为第1行元素的地址,…
    但是a[0],a[1],a[2]这3个名称又构成一个数组,其名为a,a为a[0]的地址,a+1为a[1]的地址…
    所以也可以说,a、a+1、a+2是二维数组的行地址,a[0]就是*a,就是二维数组的第0行的元素地址。
  • int *p;
    int a[3][4];
    这样一个二维数组定义后,相关于a的指针有三个:
    &a[0][0]—–这是int *类型的,即指向数组元素类型的(等效写法还有a[0]和*a)
    &a[0]—-这是int(*)[4]类型的,即指向一维数组(4个int元素)类型的(等效写法还有a)
    &a—-这是int(*)[3][4]类型的,即指向二维数组(三行四列个int元素)类型的
    LZ遇到的问题是指针类型不一致:
    指针变量是int *,所以它只能指向数组元素(int类型)
    p=&a[0][0];
    p=a[0];
    p=*a;
    小技巧:
    1.数组名和&数组名[0]等效,如a, &a[0]等效;a[0].&a[0][0]等效-----数组名前的&和最后的[0]可以同时消去
    2.* 和&是互逆操作,可以同时加上或同时消去,如a[0],*&a[0]等——消去a前的&和a后的[0]得*a

截图展示区

  1. 指向二维数组的指针数组
#include <stdio.h>

int main()
{
    static int m[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};/* 定义二维数组m并初始化*/ 
    int (*p)[4];//数组指针  p是指针,指向一维数组,每个一维数组有4int元素,同p[4] 
    int i,j;
    int *q[3];//指针数组 q是数组,数组元素是指针,3int指针
    p=m;    //p是指针,可以直接指向二维数组
    printf("--数组指针输出元素--\n");
    for(i=0;i<3;i++)/*输出二维数组中各个元素的数值*/
    {
        for(j=0;j<4;j++) 
        {
            printf("%3d ",*(*(p+i)+j));
        }
        printf("\n");
    }
    printf("\n");
    for(i=0;i<3;i++,p++)//p可看成是行指针
    {
        printf("%3d ",**p);//每一行的第一个元素
        printf("%3d ",*(*p+1));//每一行的第二个元素
        printf("%3d ",*(*p+2));//每一行的第三个元素
        printf("%3d ",*(*p+3));//每一行的第四个元素
        printf("\n");
    }
    printf("\n");
    printf("--指针数组输出元素--\n");
    for(i=0;i<3;i++)
        q[i]=m[i];//q是数组,元素q[i]是指针
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            printf("%3d ",q[i][j]);//q[i][j]可换成*(q[i]+j)
        }
        printf("\n");
    }
    printf("\n");
    q[0]=m[0];

    printf("%p\n",q[0]);
    printf("%p\n",&m[0]);
    printf("%p\n",m[0]);
    printf("%p\n",&m[0][0]);
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            printf("%3d ",*(q[0]+j+4*i));
            //指针寻址,从首地址移动4*i+j个int单位即m[i][j]的地址,
            //*(&m[0][0]+j+4*i),*(&m[0]+j+4*i)
        }
        printf("\n");
    }
    printf("\n");
}

运行结果:
一维数组与二维数组
2. 指针与字符串数组

#include<stdio.h>
#include<string.h> 
int main()
{
    char *str;
    char ch[]="www.123.com";
    str= ch;
    int len=strlen(ch),i;
    for(i=0;i<len;i++)
    {
        printf("%c",str[i]);//同*str++
    }
}

猜你喜欢