C语言中的二级指针和二维数组问题(2)


 //pointer_to_pointer = bi_array+1;//错误cannot convert from 'int (*)[3]' to 'int ** '
 /*******************以上说明二维数组和二维指针不是等价的,不能相互赋值*************************************************/
 
 pointer_to_pointer = pointer_array;
 /*******以上这句说明指针数组*[]  可以转换为二级指针** 他们相互等价*****************************************************/
 

//pointer = bi_array;//错误cannot convert from 'int [3][3]' to 'int *'
 pointer = (int *)bi_array;
 for(i=0;i<9;i++)
 {
  printf("%d\t",pointer[i]);
 }
 printf("\n");


 
 //pointer = array_pointer;//错误cannot convert from 'int (*)[3]' to 'int *'
 pointer = (int *)array_pointer;
 for(i=0;i<9;i++)
 {
  printf("%d\t",pointer[i]);
 }
 printf("\n");

for(i=0;i<9;i++){pointer[i] = 9;}    //此时指向bi_array的array_pointer的元素被pointer修改为9
 array_pointer = (int(*)[3])pointer;
 print(array_pointer,3,3);
 /********以上说明二维数组名和数组指针虽然是一个指针,但编译器并不理解,对他来说是数组类型的指针,但可以类型强制转换*****/
 

for(i=0;i<3;i++)
 {
  pointer_array[i] = bi_array[i];
 }
 printf("\n");

print((int(*)[3])pointer,3,3);
 print(pointer_to_pointer, 3 ,3);
 print(pointer_array, 3, 3);
 return 0;
}

对二维数组做如下总结:

1.二维数组和二维指针不是等价的,不能相互赋值

2.指针数组*[] 可以转换为二级指针** 他们相互等价

3.二维数组名和数组指针虽然是一个指针,但编译器并不理解,对他来说是数组类型的指针,但可以类型强制转换

pointer = (int *)array_pointer;    array_pointer = (int(*)[3])pointer;  pointer = (int *)bi_array;

4.如果想用函数传递二维数组,一般形参用二级指针**p或指针数组*[],可以支持二级指针和指针数组的实参传递,特殊的还可以用(*p)[N]

------------------------------分割线------------------------------

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码

读C++ Primer 之构造函数陷阱

读C++ Primer 之智能指针

读C++ Primer 之句柄类

C语言梳理一下,分布在以下10个章节中:

Linux-C成长之路(一):Linux下C编程概要

Linux-C成长之路(二):基本数据类型

Linux-C成长之路(三):基本IO函数操作

Linux-C成长之路(四):运算符

Linux-C成长之路(五):控制流

Linux-C成长之路(六):函数要义

Linux-C成长之路(七):数组与指针

Linux-C成长之路(八):存储类,动态内存

Linux-C成长之路(九):复合数据类型

Linux-C成长之路(十):其他高级议题

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ce68c672049b1f36d8d820e5b25f5ee4.html