首页 > 编程知识 正文

二维数组指针作为函数参数,二维数组指针表示

时间:2023-05-06 08:08:13 阅读:50897 作者:1182

int arr[3][3]的本质是指向数组的指针int[*p][3],因此二维数组名称可以传递给foo[int][*arr][3]或foo(int [][3] ) 传递给arr )可以是动态二维数组,但如果将二维数组名称显式强烈转换为二维指针,则可能不会出现编译错误,但不希望出现结果(),详见下文的引用文章)。 动态二维数组定义如下:

int **arr=new int* [3]

for .

arr[i]=new int[3]; //注意等式的左边

在中,要传递二维数组,最好传递foo(int*arr、int M、int N )和矩阵维表示。 函数中不能使用[][]操作符。 通过指针运算的方法(() ) *(arr N*i j )获得元素值,可以防止一维数组指针使用固定列宽。 如果您还想使用[][]操作符,也可以使用stl容器,如vectorvectorint vec。

以下文章来自博客公园http://www.cn blogs.com/wanpengcoder/archive/2010/07/17/1779503.html

二维数组和二次指针

前几天写了程序,在传递参数的时候想要传递二维数组,结果变成了悲剧。 函数已经写好了

fun(int**p ) ),我还以为是没有写这样的东西,这样写也是对的,结果错了,我查了资料后总结了一下。 fun(int**p ) }其中的int **p //这里的p不是二维数组的指针,而是指向指针的指针,也就是辅助指针。 正确的二维阵列指针是Int a[2][2]; int(p ) [2]; //定义为无论数组的维如何,都只能忽略第一维。 例如,inta [2] [2]={ 0,1,2,3 }; int**p=(int** ) a;//将二维数组指针强制转换为指向指针的指针时,此时p[0]=0 p[1]=1; p[2]=2; p[3]=3; 另一方面,p[0][0]=*(*(p0 )0)=**p; p[0][1]=*(*(p0 )1); p[0][0]时: *p=0;====**p=*(0); 引用地址为零的内存,一定是错误的。 p[0][1]=*(*p1 )===* ) )4)也与参照非法内存一样,存在p[1][0]=*(1) )1)=* )5) 如以上例子所示,int a[2][2]; a是指向整个数组的起始地址,int **; 所以不要期望函数fun中传递实参p=a; 前几天写了程序,在传递参数的时候想要传递二维数组,结果变成了悲剧。 函数写为fun(int**p ) }。 我没这么写。

我以为这样写也是对的,但是错了,所以我查了资料,做了总结。

fun(int**p ) }其中的int **p //这里的p不是二维数组的指针,而是指向指针的指针,也就是辅助指针。

正确的二维阵列指针是Int a[2][2]; int(p ) [2]; //定义为无论数组的维如何,都只能忽略第一维

示例: inta [2] [2]={ 0,1,2,3 };

int**p=(int** ) a;//strong制将二维数组指针转换为指向指针的指针

此时p[0]=0; p[1]=1; p[2]=2; p[3]=3;

另一方面,p[0][0]=*(*(p0 )0)=**p;

p[0][1]=*(*(p0 )1);

p[0][0]时: *p=0;====**p=*(0); 引用地址为零的内存,一定是错误的。

p[0][1]=*(p1 )===* )4),引用了非法内容

存同样,

对于p[1][0]=*(1),p[1][1]=*(5),均引用了非法内存所以说,二位数组并不能简单的转换成指向指针的指针。  

二维数组其实只是一个指针,而二级指针是指向指针的指针,所以二者并不等价。如上例所示:int a[2][2];

 a是指向整个数组的首地址,并不是int **;所以不要指望向函数fun里面传实参 p=a;

 

感謝sld666666,我覺得那個應該是和下面的情況類似把,中間有個強制轉換的過程:

 

 

#include <iostream>

 

void fun(char ** p)

{

char (*p1)[10] = (char(*)[10])p;

std::cout<<p1[0][0]<<std::endl;

}

 

int main(int argc, char* argv[])

{

char data[][10] = {"abc","def"};

fun((char **)data);

return 0;

}

----------------------------------------------------------------华丽的分割线---------------------------------------------------------------------------------------------------------------------------

 

<c程序设计语言>中的关于这个的解释:

Newcomers to C are sometimes confused about the difference between a two-dimensional array and an array of pointers, such as name in the example above. Given the definitions 

   int a[10][20];

   int *b[10];

then a[3][4] and b[3][4] are both syntactically legal references to a single int. But a is a true two-dimensional array: 200 int-sized locations have been set aside, and the conventional rectangular subscript calculation 20 * row +col is used to find the element a[row,col]. For b, however, the definition only allocates 10 pointers and does not initialize them; initialization must be done explicitly, either statically or with code. Assuming that each element of b does point to a twenty-element array, then there will be 200 ints set aside, plus ten cells for the pointers. The important advantage of the pointer array is that the rows of the array may be of different lengths. That is, each element of b need not point to a twenty-element vector; some may point to two elements, some to fifty, and some to none at all. 

Although we have phrased this discussion in terms of integers, by far the most frequent use of arrays of pointers is to store character strings of diverse lengths, as in the function month_name. Compare the declaration and picture for an array of pointers: 

   char *name[] = { "Illegal month", "Jan", "Feb", "Mar" };

with those for a two-dimensional array: 

   char aname[][15] = { "Illegal month", "Jan", "Feb", "Mar" };

 

//我的理解是,当是指针数组的时候,可以直接传,如果是普通的二维数组的话应该就进行上面的转换。


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。