关于指针和sizeof学习的一些总结

    前段时间主要学习了一些关于指针方面的知识,结合以前碰到的一些问题,在这里总结一下,便于以后进行快捷的学习。
    1)关于int * const  a(此处没给a初始化值所以有错误);和 int const * a;的区别:
    前面一个学名叫指针常量,表示整形指针a指向固定的地址,不能对a的值进行加减、赋值操作。但是可以对整形指针a的解引用(*a)进行赋值等操作;
    后面一个学名叫常量指针,表示整形指针a的解引用(*a)不能进行赋值,而a的值却可以改变。
   2)关于int *p[3]和int(*p)[3]的区别:
   前面一个是一个指针数组,它表示p是一个含有三个"数"的数组,每个"数"表示一个指向整型数的指针(用法:p[0]=&a);
   后面一个则是一个指针,它表示指针p是一个指向含有三个数的数组(用法:int a[3];
int (*p)[3];p=a;)。
   与此类似的还有:int *f();表示一个函数返回值为int *型;int (*p)f();表示一个指向函数的指针。
    3)关于sizeof和数组、指针的关系:
   首先强调一下sizeof不是一个函数,而是一个计算长度的操作符,其对长度计算是在编译阶段而不是在运行阶段

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 a[10]={0};
int *p=a;
p+=11;
cout<<*p<<endl;
这个得到数组后面内存的数据而vc++6.0不会报错;
一个是
int *fun(int x)
{
        int *a=&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后值也不确定了。


好吧这就是这段时间学到的  以后需要补充的继续补充
   
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值