首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

二维数组的地址解决方法

2013-07-04 
二维数组的地址#include stdio.hvoid ModifyArray(int ArrayNew[3][4], int row, int colmun) int main

二维数组的地址

#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;
}


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

热点排行
Bad Request.