关闭

C语言的那些小秘密之指针(四)

发表于:2011-9-28 09:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:bigloomy(CSDNblog)    来源:51Testing软件测试网采编

  在程序中我们打印了数组a中每个数组元素的值和其相应的地址,同时也定义了一个数组指针,int (*ptr)[10]; ,在引用数组指针的过程中必须要注意的是数组指针的维数必须要引用的数组维数相同,否从会出错。我们可以把int (*ptr)[10]; 拆开来看,把指针ptr看成是指向int  [10];的类型,把int  [10]视为一种新的类型,所以在使用指针ptr的时候类型必须要一致,即必须是一个int  [10]这样的数组。

  对以上的代码稍加修改:

#include <stdio.h>

void main()
{
   int arr[4][4];
   int (*ptr)[4];
   for(int i=0;i<4;i++)
   {
    for(int j=0;j<4;j++)
    {
   arr[i][j]=i*j;
   printf("a[%d]=%d\t%d\t",i,arr[i][j],&arr[i][j]);
    }
    printf("\n");
   }
   printf("\n");
   int j=0;
   ptr=arr;
   printf("\nptr=%d\t&arr=%d\t&arr[0]=%d\t&arr[0][0]=%d\n",ptr,&arr,&arr[0],&arr[0][0]);
   printf("\n");
   for(;j<16;j++)
   {
    if(j%4==0&&j!=0)
     printf("\n");
    printf("ptr%d=%d\t%d\t",j,*((*ptr)+j),&(*ptr)[j]);
   }
   printf("\n");
}

  运行结果如下:

  可能有的读者看了int arr[4][4];int (*ptr)[4]; 这两句代码之后认为接下来的代码ptr=arr;有错,因为arr是一个二位数组,而ptr只是一个指向int  [4]类型的指针。但是要注意了,从运行结果我们也可以肯定的是上面的代码是正确的,但是为什么是正确的呢?!首先我们把arr分为两部分来看,第一部分为int  [4],第二部分为arr[4],这样就一目了然了,我们可以认为我们定义了一个一维数组arr[4],数组有四个元素,每个元素的类型为int  [4],因此和一般的数组一样,我们可以将该数组名赋给指针,其实也就是第一个元素的地址付给指针。即: ptr=arr;或者ptr=&arr[0]。其余情况以此类推。

  下面再来看看一段代码:

#include <stdio.h>

void sum(int s[])
{
 int i;
 printf("%d\n",s);
 printf("%d\n",*(s+3));
 printf("%d\n",&s);
 printf("%d\n",*s++);
 printf("%d\n",*s++);
 printf("%d\n",*s++);
 printf("%d\n",*s);
 printf("\n");

}

void main(int argc,char *argv[])
{
 int ss[4];
 for(int i=0;i<4;i++)
  ss[i]=i;
 sum(ss);
 printf("%d\n",ss);
 printf("%d\n",&ss);
}

32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号