定义的函数
int** aFunc(int** a) {
int **b = **a;
retrun b
}
int main() {
int a[2][2]={{1,1},{2,2}}
int **b = aFunc(a);// 这里会出现警告
}
出现警告
incompatible pointer types passing 'int [n][n]' to parameter of type 'int **' [-Wincompatible-pointer-types]
int **
和int[][]
不一样,那这里应该怎么写才可以消除这个警告。
为什么会出现这个警告?因为二维数组是知道每行元素占多少地址?
谢谢大神指点!
你说的对,其实就是因为二维数组知道每行元素占多少地址。。。。在aFunc里面是不能写成
a[1][1]
的(不是真的不可以写),所以给出的只是警告,一般情况下不会出什么问题。pt1
和pt2
是两种不同的类型。无论如何(32位程序)一个指针占用四个字节。定义指针的类型的意义除了在编译的时候检查类型,还有就是让指针的加/减法有意义(或者说更加方便)。
p1++
的意思是指向下一个元素,而当前这个元素占用多大的内存就记录在指针的类型中了。为了统一/减少概念性的东西,二维数组被认为是一个一维数组其中的每一个元素又是一个一维数组。所以指针
++
指向下一个元素,编译器就必须知道数组的第一维有多大,这个第一维有多大就记录在指针的类型里面。 所以其实pt1
的意思是,这是一个指针,它指向的元素占用2个int型的空间。pt2
的意思是,这是一个指针,它指向的元素占用了4个字节(32位程序,或者说它指向的元素是一个指针)。因为编译器从来不检测数组越界,所以指针的最后一维的值是不需要记录在指针类型中的。
因为编译器从来不检测
p1[10]
是否是合法,所以p1
的类型里面不需要包含7
这个信息,因此p1
和p2
是相同的类型,同样pp1
和pp2
也是相同的类型。所以编译器出现警告就是因为两者的类型不同,所以消除警告的方式就是强制类型转换或者是把函数的形参和实参写为相同的类型,比如
int ** aFunc(int a[][2])