C指针与数组

a) int a; // An integer 

b) int *a; // A pointer to an integer 

c) int **a; // A pointer to a pointer to an integer 

d) int a[10]; // An array of 10 integers 

e) int *a[10]; // An array of 10 pointers to integers 

f) int (*a)[10]; // A pointer to an array of 10 integers 

g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer 

h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

数组名的指针,即数组首元素地址的指针。即是指向数组的指针。
例:int (*p)[10]; p即为指向数组的指针,又称数组指针。

1数组指针与指针数组

数组指针是指向数组首元素的地址的指针,其本质为指针;
指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。
数组指针的使用在某些情况下与指针数组很相似,要注意区别。

2二维数组指针

为了能更好地理解数组指针,与普通指针及二级指针的区别,下面举例说明一下。
例如:{int a[4][5];int (*p)[5]=a;}这里a是个二维数组的数组名,相当于一个二级指针常量;
p是一个指针变量,它指向包含5个int元素的一维数组, 此时p的增量 以它所指向的 一维数组长度为单位;
*p+i是二维数组a[0][i]的地址;
*(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)表示a[2][3]的值。
//(*p)[5]其中的5换成其他的数字在vc++6.0环境中都无法通过编译
(*p)[5]其中的5在上述例子中没有表示任何意思你可以换成除0以外的整数,[5]的作用就是帮助你记忆说你所指向的一维数组的长度。(不过除了与定义的二维数组的长度一致的不会警告之外 )其他的数会警告但是不影响结果。

3举例

数组指针:
  
char c[][3] = {"妹", "妹", "你", "坐", "船", "头"};
  char (*p)[3];
  int i;
p = c;
  for(i=0; i<6; i++)
  {
  printf("%s, ", *(p+i)); //*(p++);
  }
printf("\n"); //p=c;/p--;

  for(i=5; i>=0; i--)
  {
  printf("%s\n", *(p+i)); //*p--;/*--p;
  }
指针数组:
int i;
  char *pch[6] = {"妹","妹","你","坐","船","头"}; //这种写法不提倡,应该先声明一个数组,再把地址给指针,
  for(i=0;i<6;i++) //否则很危险;
  {
  printf("%s, ",*(pch+i));
  }
  printf("\n");
  for(i=5; i>=0; i--)
  {
  printf("%s\n",*(pch+i));
  }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值