C语言中的指针与多维数组

c语言把二维数组看作是一维数组的集合,即二维数组是一个元素为一维数组的特殊一维数组
不带任何下标的二维数组名表示二维数组的起始地址.
只带一维下标的二维数组名表示作为其元素的一个一维数组(即二维数组一行)的起始地址,对其进行加法操作时表示该一维数组(即二维数组一行)的一个元素的地址。
例:  int a[4][5],*p;
 p=a[0];
此时p指向一维数组a[0]的起始地址,即p、a[0]、&a[0][0]相同。对其进行加法操作时p+1等同于a[0]+1,都指向数组元素a[0][1].所以*(p+1)等于元素a[0][1]的值。
输入输出二维数组a[2][3]全部元素。
#include "stdio.h"

void main()
{
 int a[2][3],i,j;
 int *p;
 for(i=0;i<2;i++)
 {
  for(j=0;j<3;j++)
  {
   scanf("%d",&a[i][j]); 
  
 
 p=a[0];
 for(;p<a[0]+6;p++)
 {
  printf("%4d",*p); 
 }
    a[4][5]     a[2][3]     a[0]+10+3===a[0]+13
由此可见,任何一个二维数组a[m][n]的元素a[i][j]的地址,都可以用a[0]+i*n+j来表示。大多数浮点型的多维数组都采用此种方法处理。此外由于这种方法无需知道数组的行数和列数,只要根据数组的元素总数即可进行数组的数据处理。所以他的通用性更好。

指向二维数组中一维数组的指针变量
c语言规定一种指针变量可以指向作为二维数组元素的一个一维数组(即二维数组的一行),对这种指针变量进行加减操作则指针将在二维数组中的行上移动。
类型符 (*指针变量名)[指向的一维数组元素的个数]
那么对于一个由2行3列组成的二维数组a[2][3],如果指针变量p指向这个二维数组中包含3个元素的第一行一维数组,则指针变量p的定义和赋值形式如下:
int a[2][3],(*p)[3];
p=a;
此时p指向二维数组a的起始地址。对其进行加法操作时p+1等同于a+1,指向包含3个元素的一维数组a[1].所以*(p+1)等于一维数组名a[1],*(p+1)+1等于a[1]+1,所以*(*(p+1)+1)等于a[1][1].
比较指向数组元素的指针变量和指向数组的指针变量的不同。
#include "stdio.h"

void main()
{
 int a[2][3]={1,2,3,4,5,6};
 int *p1,(*p2)[3];
 p1=a[0];
 p2=a;
 for(;p1<a[0]+6;p1++)
 {
  printf("%4d",*p1); 
 }
 printf("\n");
 for(;p2<a+2;p2++)
 {
  printf("%4d",*(*p2)); 
 }
 printf("\n");
}

二维数组a[m][n]的元素a[i][j]的地址,用指向包含n个元素的一维数组的指针变量p表示形式为:*(p+i)+j,即*(*(p+i)+j)等于a[i][j]的值。   int (*p)[n]
指向数组的指针变量在使用时,要注意与元素是指针类型的指针数组的区别。例如:int(*q)[3],*p[3];
q是指向一个包含3个整型元素的一维数组的指针变量,p是一个由p[0]\p[1]\p[2]共3个指向整型数据的指针组成的一维数组。   int *p[3]

指向指针的指针属于“二级间址”,它定义的一般形式为:
类型名  ** 指针变量名;
例如: int **p;
表示p是一个指向int 型指针变量的指针。
#include "stdio.h"
void main()
{
 static char *str[]={"How","are","you"};
 char **p;
 p=str+1;
 printf("%s\n",*p);
 printf("%c\n",**p);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

minyuanxiani

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值