一维数组与二维数组
程序员文章站
2022-07-16 07:53:48
...
问题研究
- 数组维度的联系??
- 相邻维度数组的关系?
要点:
- 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
截图展示区
- 指向二维数组的指针数组
#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是指针,指向一维数组,每个一维数组有4个int元素,同p[4]
int i,j;
int *q[3];//指针数组 q是数组,数组元素是指针,3个int指针
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++
}
}