欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一维数组与二维数组

程序员文章站 2022-07-16 07:53:48
...

问题研究

  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++
    }
}