const array [] []作为C - 不匹配中的形式参数

时间:2015-04-17 07:01:14

标签: c multidimensional-array const-correctness

我希望foo()不要修改数组。所以我在foo()中将数组声明为const

如果我编译这段代码,编译器就会抱怨:

#include <stdio.h>

void foo(const int arr[5][5])
{
    int i,j;
    for( i = 0; i < 5; i++)
    {   
        for( j = 0; j < 5; j++) 
        {       
            printf("%d\n", arr[i][j]);
        }       
    }   
}
int main()
{
    int val = 0;
    int i,j;
    int arr[5][5];
    for( i = 0; i < 5; i++)
    {   
        for( j = 0; j < 5; j++) 
        {       
            arr[i][j] = val++;
        }       
    }   
    foo(arr);
}

警告是:

allocate.c: In function 'main':
allocate.c:26:9: warning: passing argument 1 of 'foo' from incompatible pointer type
     foo(arr);
         ^
allocate.c:3:6: note: expected 'const int (*)[5]' but argument is of type 'int (*)[5]'
 void foo(const int arr[5][5])
      ^

我怎样才能将形式参数声明为常量?

1 个答案:

答案 0 :(得分:-1)

我假设您不希望foo()能够为了封装而修改数组。

您可能知道,C数组通过引用传递给函数。 因此,foo()对values数组所做的任何更改都将传播回main()中的变量。这不符合封装的利益。

const不会阻止foo()修改数组 C关键字const意味着某些东西不可修改。 const指针不能修改它指向的地址。该地址的值仍然可以修改。 在c中,默认情况下,您不能将新指针值分配给数组名称。不需要const。与const指针类似,此数组中的值仍然可以修改。封装问题没有解决。

要从main()函数封装foo(),请将数组放入struct中。结构按值传递,因此foo()将接收数据的副本。由于它有副本,foo()将无法更改原始数据。您的功能已封装。

解决方案(有效!):

#include <stdio.h>

typedef struct
{
    int arr[5][5];
} stct;

void foo(const stct bar)
{
    int i,j;
    for( i = 0; i < 5; i++)
    {   
        for( j = 0; j < 5; j++) 
        {       
            printf("%d\n", bar.arr[i][j]);
        }       
    }   
}
int main()
{
    int val = 0;
    int i,j;
    stct bar;
    for( i = 0; i < 5; i++)
    {   
        for( j = 0; j < 5; j++) 
        {       
            bar.arr[i][j] = val++;
        }       
    }   
    foo(bar);
}

我将const放在foo()定义中,因为您询问如何将形式参数声明为常量。它有效但不需要。

void foo(stct bar)

删除const不会破坏该功能。