int*a[3] 与 int (*a)[3]的区别
谢谢
int* a[3];
int i = 100;
a[0] = &i;
a[1] = &i;
a[2] = &i;
a[5] = &i;//也能通过~
cout<<*a[0];
[解决办法]
int(*a)[3]可以理解为:int a[3];(当然,不用我们delete的)
即:它只是一维的;
而另外一个是二维的;
[解决办法]
int *a[3]; a是一个3个元素的数组,数组的元素是指向整型的指针
int (*a)[3]; a是一个指针,其指向含有3个元素的数组,数组的元素是整型
[解决办法]
楼主定义了int* a[3];就是申请了一个有三个元素的数组,数组元素是int*,int i = 100; a[5] = &i;能通过是因为数组就是一段连续的内存空间而已,a就是它的首地址,数以a[n]“n为正整数”你都可以访问,所以a[5] = &i;可以通过;a[100]会有运行时错误的原因很简单,你调用一个函数时,如果申请的变量都是在这个函数的堆栈上的,同时函数调用后的返回地址也是在堆栈上的(在你申请的变量之前入栈的),当你越界访问你的数组时,你改变了你这个函数的返回地址,所以这个函数执行完毕后,无法找到正确的返回地址,程序就出错了!这种问题归根结底是由于你对数组的越界访问造成的!如果想了解更具体的相关知识,可以看一看缓冲区溢出和函数堆栈崩溃方面的东东!
[解决办法]
C/C++数组不限制越界.
a[0],a[1],a[2],是系统给数组a分配的有效空间,但是a[3],a[4],a[5]......是紧接着a数组的空间,这些空间可能是空闲的,也有可能是已经被分配给其他变量常量的
比如:
...
int a[3]={4,5,6};
int x=1,y=2,z=3;
a[3]=7;a[4]=8;a[7]=9;
...
在vc中系统会随机找一个12个字节(一个int占4字节)的可用空间分配给a数组,假设地址是2000,2001,2002,2003.
x,y,z也是随机分配地址,现在假设系统给x的分配的地址是2004,y是2005,z是2008.
那么a[3]=7即x=7,a[4]=8就是y=8,a[7]=9就是z=9;
,所以a[i]里的i可以大于数组的元素总个数,但是引发的问题是不可预知的,如果数组a后面是一些已经占用该地址的重要变量或常量可能引发程序崩溃
把指针学明白了指针和数组的关系搞明白了,你就知道了
[解决办法]
int* a[3]
一个有3个元素的数组,元素类型是 int指针
int (*a)[3]
一个指针,指向有3个int元素组成的数组
a[5] = &i;//也能通过~
在c++中编译不检查这个(java中是检测的),但程序本省这样是错误的,运行的时候必将出现不可知的结果,往往当机