读书人

二维数组的地址解决方法

发布时间: 2013-07-04 11:45:28 作者: rapoo

二维数组的地址

#include <stdio.h>

void ModifyArray(int ArrayNew[3][4], int row, int colmun) ;
int main(int argc, char *argv[])
{
int array[3][4] ;
int i, j ;

for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
array[i][j] = i*4 + j ;
}
}

for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
printf("%d,", array[i][j]) ;
}
puts("\n") ;
}
ModifyArray(array, 3, 4) ;
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
printf("%d,", array[i][j]) ;
}
puts("\n") ;
}
return 0 ;
}

void ModifyArray(int ArrayNew[3][4], int row, int colmun)
{
int i, j;
int *p ;
//p = &ArrayNew[0][0] ;
//p = &ArrayNew[0] ;
p = &ArrayNew ;
for(i = 0; i < row; i++)
{
for(j = 0; j < colmun; j++)
{
*(p + i*4 + j) = i*4 + j + 12;
}
}


}



使用
p = &ArrayNew ;

时,会导致意外修改row和colmun的值,导致程序运行的结果有错
不知道这是神马情况
[解决办法]
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
[解决办法]
引用:

//p = &ArrayNew[0][0] ;
//p = &ArrayNew[0] ;
p = &ArrayNew ;
的地址不都是一样的吗


p = &ArrayNew[0][0];p指向的是一个整型的指针
p = &ArrayNew[0];p指向的是一个一位数组的指针
p = &ArrayNew;p指向的是一个二维数组的指针,注意:p++的结果是ArrayNew[2][3]的下一个的下一个地址,
因为p++的实现是p += sizeof(p)即p += 6;


#include <iostream>

using namespace std;

int main()
{
int ArrayNew[2][3] = {
{1, 2},
{3, 4}
};

//p points to int
int *p = &ArrayNew[0][0];
cout<<"*p="<<*p<<endl;//*p = 1
p++;
cout<<"*p="<<*p<<endl;//*p = 2
p++;
cout<<"*p="<<*p<<endl;//*p = 0
p++;
cout<<"*p="<<*p<<endl;//*p = 3

int *p2 = (int *)&ArrayNew;
cout<<"*p2="<<*p2<<endl;
p2++;
cout<<"*p2="<<*p2<<endl;

int (*p3)[3]= ArrayNew;//ArrayNew equals ArrayNew[0]
cout<<"(*p3)[0]="<<(*p3)[0]<<endl;
cout<<"(*p3)[1]="<<(*p3)[1]<<endl;
cout<<"(*p3)[2]="<<(*p3)[2]<<endl;
p3++;//p3 -> ArrayNew[1]
cout<<"(*p3)[0]="<<(*p3)[0]<<endl;
cout<<"(*p3)[1]="<<(*p3)[1]<<endl;


cout<<"(*p3)[2]="<<(*p3)[2]<<endl;


int (*p4)[2][3] = &ArrayNew;//ArrayNew equals ArrayNew[0][0]
cout<<"(*p4)[0][0]="<<(*p4)[0][0]<<endl;
cout<<"(*p4)[1][0]="<<(*p4)[1][0]<<endl;
p4++;//p4 -> ArrayNew[2][3]'s next address
cout<<"(*p4)[0][0]="<<(*p4)[0][0]<<endl;//这个在使用中是很危险的,一定要注意!

return 0;
}


运行结果:
二维数组的地址解决方法
[解决办法]
二维数组作为参数进行传递的时候传递的是一个二级指针,那么用于接收这样一个指向二维数组的首地址的参数就必须是一个数组指针(指向数组的指针)或者是一个二级指针。过多的不说了。加油

读书人网 >C语言

热点推荐