c缺陷与陷阱笔记-第三章 语义陷阱

时间:2022-06-12 21:21:26

1.关于数组和数组指针

  数组的名字默认是常量指针,值不能改变的,例如

  int a[]={1,2,3,...},这个a的类型时int *,所以如果有int *p,那么a=p是合法的,其他的指针类型,例如char *p=a都是不合法的

  2维或者多维数组的指针声明,例如2维数组 int a[12][31],那么声明数组的指针应该是 int (*p)[31],p是一个数组指针,它指向的数组有31个int元素,p的实际类型应该是int**的,所有把int*类型赋值给int**类型时错误的,例如

  int a[10];

  int (*p)[10];

  p=a;//是错误的

  正确使用数组指针应该是:

  int a[12][31];

  int (*p)[31];

  for(p=a;p<&a[12];++p)

  {  

    int *day=*p;

    for(;day<&(*p)[31];++day)

      对*day操作

  }

  上述中,p和a都是int**类型的,a[12]是int*类型的,所以要&a[12],*p是int*类型的,代表 1维数组int [31]的数组名或指针