char **, char *a[] ,char (*a)[] 思考

来源:互联网 发布:淘宝账户体检中心 编辑:程序博客网 时间:2024/05/08 05:42

1.指向数组的指针


     int (*a)[ 10] ;
          (*a) 代表的是一个指针, 接着[] 下标的引用,解释了a指向int类型的数组。
           int matix[3][10]; 
     初始化: int (*a)[10] =matix;
     它使得a 指向 matiix的第一行

     如果需要一个指针逐个访问整形元素而不是逐行在数组中移动
     int *p = &matix[0][0];
     int *p = matrix[0];
  1.      增加这个指针使得它指向下一个元素。
  2. 错误: int (*a)[] = matrix;
  3. 这样数组长度不见了,当某个整数与这种类型的指针执行指针运算时,它的值将根据数组的长度调整。

作为函数参数


多维数组的每个元素本身是两外一个数组,编译器需要知道它的维度,以便为函数形参的下标进行求值。

所以函数参数声明:

void fun(int (*mat)[10]);
void fun(int mat[][10]);
第一个下标会根据包含10个元素的整形数组的长度进行调整。
接下的下标编译器必须各维的维度才能对个下标进行求值。

                
             二维数组内存分布(实际上应该是线性的)


2指针数组(向量):


int  *a[10];

因为[]优先级高于*

char  * keyword[]={
"Rose",
"Tom",
"Alice",
"Brown",
"Strong",
NULL
}
#define N (sizeof(keyword)/ sizeof(keyword[0]))
//sizeof(keyword)是整个数组所占用的字节数


char **a  和 char *a[] 在函数形参中可以互换

void func ( char **a);
void func (char *a[]);

 因为传递给函数的参数的一份拷贝, 拷贝的是数组的a[0]地址,也就是一个指针的指针。

3.指针和数组混用


     1.作为表达式中的数组名  就是指针
     2.c语言把数组下标作为指针的偏移量
     3.作为函数参数的数组名等同于指针



          


0 0