int (*p)[3];p=a;)。
int a[10]={0};int *p=a;
sizeof(a)=40;而sizeof(p)=4;
对于数组sizeof计算的是整个数组所占有的内存空间大小(单位为字节),所以其大小为40,而对于指针p,sizeof计算的是它本身所占有的空间的大小也就是4(因为对于32位机器不管对于任何类型的指针大小都为4)
不管数组是否为空,sizeof计算的都是该数组总的大小,对于字符数组strlen计算的是里面所存储的字符的数量(不包括最后的'\0')。如下例所示:char a[]="abc";sizeof(a)=4; char a[10]="abc";sizeof(a)=10; char a[10]="abc";strlen(a)=3;
对于动态分配的数组double *a=new double[10];sizeof(a)=4;这说明进一步说明sizeof对长度计算是在编译阶段而不是在运行阶段。
关于几个访问内存越界或者访问已回收内存的讨论:
一个是:
int *p=a;
p+=11;
cout<<*p<<endl;
这个得到数组后面内存的数据而vc++6.0不会报错;
一个是
int *fun(int x)
{
return a;
}
int main()
{
int a=10;
int *b=fun(a);
cout<<*b<<endl;
return 0;
}
因为子函数运行时分配了一个空间,当它运行完后就会收回x所占有的内存区,所以主函数还是可以访问该区,不过值不确定了。
还有一个是:
int *fun(int x)
{
int *b=new int[10];
b[0]=10;
//delete []b;
return b;
}
int main()
{
int *b=fun(a);
cout<<*b<<endl;
return 0;
}
只要不delete主函数还是会得到值,所以在这儿如果循环够大可以使内存区溢出,而在delete后值也不确定了。
好吧这就是这段时间学到的 以后需要补充的继续补充