数组与指针总结

指向数组元素的指针:
所谓数组元素的指针就是数组元素的地址。

首先定义一个数组:
int a[10];
再定义一个指针:
int *p;
将数组的首地址赋给指针p有两种方法:
p = a;//数组名代表数组中第一个元素(即序号为0的元素)的地址
p = &a[0];//使用取地址运算符获得数组第一个元素的地址
这两种方法是等价的。

也可以在定义指针变量时初始化:
int *p = a;//这里的*表示定义的是指针变量,不是间接访问运算符(又称指针运算符):取内容
int *p = &a[0];
先定义后赋值,和定义的时候就初始化,他们是有区别的。
int *p = a;这句语句,相当于int *p; p = a;两句。这两种方法不能搞混了。

给数组元素赋值的方法:
a[i] = 1; *(p+i) = 1;
引用数组元素的说明:
(1)p+i和a+i就是a[i]的地址,它们指向a数组的第i个元素。
p+i和a+i的计算方法为:p+i*d,a+i*d.d为一个数组元素所占的字节数。
(2)*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i].
[]是变址运算符。
使用指针引用和给数组赋值已经没有问题了。可以用指针变量作函数参数接收数组地址,这里略过。
 
下面总结一下指针和二维数组。

首先定义一个二维数组:
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
a是一个数组名。a数组包含3行,即3个元素:a[0],a[1],a[2]。而每个元素又是一个一维数组,它包含四个元素。所以可以认为二维数组是“数组的数组”,即二维数组a是由3个一维数组所组成的。
 
从二维数组的角度来看,a代表二维数组首元素的地址,现在的首元素不是一个整型变量,而是由4个整型元素所组成的一维数组。所以a代表的是首行的起始地址(即第0行的起始地址,&a[0]),a+1代表a[1]行的首地址。
 
a[0],a[1],a[2]都是一维数组名。数组名代表数组首元素的地址,所以a[0]代表&a[0][0],a[1]代表&a[1][0],a[2]代表&a[2][0]。a[0]+0,a[0]+1,a[0]+2,a[0]+3分别是a[0][0],a[0][1],a[0][2],a[0][3]元素的地址。
 
如果要得到a[0][1]的值,用地址法怎么表示呢?a[0][1]元素的值就是*(a[0]+1),而a[0]又是和*(a+0)无条件等价的,因此可以用*(*(a+0)+1)表示a[0][1]的值。依此类推,*(a[i]+j)或*(*(a+i)+j)是a[i][j]的值。
 
指向多维数组元素的指针变量:
1:指向数组元素的指针变量
int *p;使p指向二维数组的第一个元素的首地址,通过增加地址值来遍历整个二维数组。因为二维数组在内存中是顺序存放的。
2:指向由m个元素组成的一维数组的指针变量
如果指针变量p指向a[0](即p = &a[0]),则p + 1不是指向a[0][1],而是指向a[1],p的增值以一维数组的长度为单位。
定义指向包含m个元素的一维数组的指针变量:int (* p)[m];赋值:p = a;引用:*(*(p+i)+j);

程序示例:
#include <stdio.h>
int main()
{
 int a[5] = {1,2,3,4,5};
 int b[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
 int i = 0, j = 0;
 int *p;
 p = a;//or p = &a[0];
 printf("a[i]/t*(a+i)/t*(p+i)/n");
 for (i =0; i< 5; i++)
 { 
  printf("%d/t%d/t%d/n",a[i],*(a+i),*(p+i));
 }
 printf("/nAddress of:/nb/t/tb[0]/t/tb[1]/t/tb[2]/n");
 printf("%p/t%p/t%p/t%p/n",b,b[0],b[1],b[2]);
 printf("/nTravel of Two_Dimension_Array B:/n");
 for(i = 0; i < 3; i++)
 {
  printf("Array of b[%d]: ",i);
  for(j = 0; j < 4; j++)
  {
   printf("%d/t",*(b[i]+j));//等j价于*(*(b+i)+j)
  }
  printf("/n");
 }
 printf("/nTravel of Two_Dimension_Array B:/n");
 int *ptr = b[0];//or int *ptr = &b[0][0];
 for(i = 0, j =0; i < 12; i++)
 {
  printf("%d/t",*ptr++);
  j++;
  if(j%4 == 0)
   printf("/n");
 }
 printf("/nTravel of Two_Dimension_Array B:/n");
 int (*ptr_array)[4] = b;//指向m个元素组成的一维数组的指针变量
 for(i = 0; i < 3; i++)
 {
  for(j = 0; j < 4; j++)
  {
   printf("%d/t", *(*(ptr_array+i)+j));
  }
  printf("/n");
 }
 printf("/nSomething else:/n");
 printf("/nTravel of Two_Dimension_Array B:/n");
 int (*(*pptr))[4] = &ptr_array;//指向m个元素组成的一维数组的指针变量的指针变量
 for(i = 0; i < 3; i++)
 {
  for(j = 0; j < 4; j++)
  {
   printf("%d/t", *(*(*pptr+i)+j));
  }
  printf("/n");
 }
 char *string[3][4] = {"visual basic","c#","c++","inheritance",
        "visual.net","base class","perl","python",
        "visual c++","pasical","fortuan","c",};
 char *(*chptr)[4] = string;//指向m个字符串元素组成的一维数组的指针变量
 printf("/nTravel of Two_Dimension_Array string(Character Array):/n");
 for(i = 0; i < 3; i++)
 {
  for(j = 0; j < 4; j++)
  {
   printf("%s/t/t", *(*(chptr+i)+j));
  }
  printf("/n");
 }
 printf("/n");
 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值