2013-06-29 107 views
1
#include <iostream> 
using namespace std; 

int main() 
{ 
    int **a; 
    int b[5] = {3,4,5,6,1}; 
    *a=b; 
    cout << *((*a)+0) << endl; 
    return 0; 
} 

根据我的理解,*((*a)+0)相当于(*a)[0]。我错了吗?我怎样才能让上面的代码打印数组的第一个元素?为什么我的代码会产生分段错误?

为什么这个的代码工作?

#include <iostream> 
using namespace std; 

int main() 
{ 
    int *a; 
    int b[5] = {3,4,5,6,1}; 
    a=b; 
    cout << *(a+0) << endl; 
    return 0; 
} 

当我更换a*a无处不在,为什么错了?

+0

您没有为'a'分配任何内存。 – Musa

+2

您将指向int *的*指针赋值给作为指向int指针的'a'的'a'。所以你必须将* pointer *的内存分配给'int指针'。 – Nawaz

+0

这样看待:'int * a'可以看作'(no_adr_ptr)a',当你做'a = b'时它会变成'(adr_of_b)a'; 'int ** a'变成'(no_adr_ptr(no_adr_ptr)a)',当你做'* a = b'时变成'(no_adr_ptr(adr_of_b)a)'。 hth – slashmais

回答

11

您在

*a=b; 

访问未初始化的指针此时a点到一个随机位置,且与不确定的行为规则你无法预知会发生什么。对你来说,它似乎是一个你不能写信的位置,所以你会崩溃。


第二个变量的工作,因为你做ab,你不写一个未初始化的指针,你实际上初始化指针与第一项的b位置。

+0

谢谢。你可以给我一个在线参考,我可以完全阅读和理解吗? – Alex

+0

@亚历克斯对不起,但不幸的是我不知道任何好的指针教程。 –

+3

Stroustrup。第1至1600页左右。 – AlexK

相关问题