将数组和矩阵传递给函数,作为C中指针的指针和指针

栏目: C · 发布时间: 7年前

内容简介:http://stackoverflow.com/questions/546860/passing-arrays-and-matrices-to-functions-as-pointers-and-pointers-to-pointers-in

给出以下代码:

void
foo( int* array ) 
{
    // ...
}

void
bar( int** matrix ) 
{
    // ...
}

int
main( void ) {
    int array[ 10 ];
    int matrix[ 10 ][ 10 ];

    foo( array );
    bar( matrix );

    return 0;
}

我不明白为什么我得到这个警告:

warning: passing argument 1 of ‘bar’ from incompatible pointer type

虽然’foo’的电话似乎没问题.

谢谢 :)

那么C社区肯定不太了解,可以通过扫视SO来看待.魔法是,以下所有都是完全100%,相当于:

void foo(int (*array)[10]);
void foo(int array[][10]);
void foo(int array[10][10]);
void foo(int array[42][10]);

绘制指针和数组的区别非常重要.数组不是指针.数组可以转换为指向其第一个元素的指针.如果你有一个指针,你有这个:

--------
| ptr  |  -------> data
--------

但是,如果你有一个数组,你可以这样做:

---------------------------
| c1 | c2 | c3 | ... | cn |
---------------------------

使用指针,数据位于整个其他星球,但是由指针链接.数组本身就有数据.现在,一个多维数组只是一个数组.数组嵌套到父数组中.那么你的数组的sizeof是:

(sizeof(int) * 10) * 10

那是因为你有10个数组,它们都是10个整数的数组.现在,如果要传递该数组,则转换它.但到什么?指向其第一个元素的指针.元素类型不是指针,而是数组.因此,您将指针传递给一个10 int的数组:

int (*)[10] // a pointer to an int[10]

它不是int *的数组,也不是int **.您可能会问为什么数组不会作为int **传递.这是因为编译器必须知道行长度.如果你做了一个数组[1] [0],那么编译器会把一个sizeof(int)*的地址与二维数组的开头相隔10个字节.它解码指针到数组类型中的信息.

所以,你必须选择上述完全等效的功能原型之一.当然,最后一个只是混乱.如果将参数声明为数组,编译器将静默地忽略在最外层维度编写的任何数字.所以我也不会使用第二个版本.最好是使用第一个或第二个版本.需要记住的是C没有(真正的)数组参数!该参数将是最后的指针(在这种情况下指向数组).

注意上面的多维情况如何与以下退化的一维情况相似.以下所有4个版本完全相同:

void foo(int *array);
void foo(int array[]);
void foo(int array[10]);
void foo(int array[42]);

http://stackoverflow.com/questions/546860/passing-arrays-and-matrices-to-functions-as-pointers-and-pointers-to-pointers-in


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Domain-Driven Design

Domain-Driven Design

Eric Evans / Addison-Wesley Professional / 2003-8-30 / USD 74.99

"Eric Evans has written a fantastic book on how you can make the design of your software match your mental model of the problem domain you are addressing. "His book is very compatible with XP. It is n......一起来看看 《Domain-Driven Design》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试