注册 登录
编程论坛 VC++/MFC

一个关于数组的指针问题,请大家帮忙看看

Invariably 发布于 2011-05-08 15:05, 523 次点击

这个程序是没有问题的,但是把&A[0][0]如果改成&A[N][N](就是程序中用红色标记出来的地方)怎么就不对了呢,这两个不是表示同一个地址吗?请打大家帮忙看看,谢谢了!
#include<iostream>
using namespace std;
const N=3;
void print_matrix(int*q=NULL,int n=1)//把矩阵A打印到屏幕上
{
    cout<<"A的"<<n<<"次方 ="<<endl;
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
        {
            cout.width (5);
            cout.fill();
            cout<<*(q+i*N+j)<<',';
        }
        cout<<endl;
    }
}
int main()

{
A={{1,2,3},{2,3,4},{3,4,1}};
    print_matrix(&A[0][0]);
        return 0;
}

[ 本帖最后由 Invariably 于 2011-5-8 15:10 编辑 ]
4 回复
#2
yuccn2011-05-08 15:47
&A[0][0]实质就是A所指地址,也就是数组首地址。
&A[N][N]即是&A[3][3];也就是 A + 3 * 3 + 3 这个地址,已经是数组之外的一个位置了,非法内存访问,你最大运行访问到的地址是&A[2][2] (位置为A + 3 * 2 + 2),

就算你传参的时候传&A[2][2],它和&A[0][0]也不是一个位置了,一个数数组的首地址一个是末尾地址,怎么会相同?

还有一个就是print_matrix(int*q=NULL,int n=1)这个函数有个默认参数,是不是你想传q=NULL?如果那样你的程序一定会非法内存访问的了 也就是说崩溃。

[ 本帖最后由 yuccn 于 2011-5-8 15:49 编辑 ]
#3
Invariably2011-05-08 16:52
谢谢,明白了。。。
哪个print_matrix(int*q=NULL,int n=1)只是在定义一个只指针的时候给它赋了一个初值,并没有要传q=NULL.
在问一下数组名A为什么不能直接传上去呢,而要写成&A[0][0]呢?数组名里面放的不就是数组的首地址吗,这两个有什么区别吗?

[ 本帖最后由 Invariably 于 2011-5-8 16:55 编辑 ]
#4
yuccn2011-05-08 21:08
&A[0][0] 可以写成传 A[0]就行了,因为A是一个指针的指针了,A[0]可以理解为一个指针了
#5
Invariably2011-05-08 21:25
知道了,谢谢
1