关于指针a与&a所代表的内存空间
2014-10-23 15:40
197 查看
遇见一道题:
以为*p-1应该输出为1,但跑过程序才发现输出为3
然后就debug了一下,经过若干调试,发现规律如下:
a作为数组的指针,其值为该数组内存的起始地址,而在debug中,&a的值与a相同。但若对a与&a进行加减法运算时,则发现,a+1与&a+1对1的理解不同。
a+1将a看作是一个指针,而指针的大小在32位系统中为4字节(32位),所以结果为a的值加上4;
&a+1将a所指向的地址空间看作一个整体,而此处a指向一个12字节的内存空间(sizeof(a) == 12),所以结果为a的值加上12;
所以,暂且得出结论为:a为一个指针,其指向的是a的类型所代表的内存空间大小;而&a则指向以a的值为起始地址的整个内存块(大小为sizeof(a)的值)。
但不敢确定,望各位大神指正!
int a[3] = {1, 2, 3}; int *p = (int*)(&a+1); printf("%d, %d", *(a+1), *(p-1));
以为*p-1应该输出为1,但跑过程序才发现输出为3
然后就debug了一下,经过若干调试,发现规律如下:
a作为数组的指针,其值为该数组内存的起始地址,而在debug中,&a的值与a相同。但若对a与&a进行加减法运算时,则发现,a+1与&a+1对1的理解不同。
a+1将a看作是一个指针,而指针的大小在32位系统中为4字节(32位),所以结果为a的值加上4;
&a+1将a所指向的地址空间看作一个整体,而此处a指向一个12字节的内存空间(sizeof(a) == 12),所以结果为a的值加上12;
所以,暂且得出结论为:a为一个指针,其指向的是a的类型所代表的内存空间大小;而&a则指向以a的值为起始地址的整个内存块(大小为sizeof(a)的值)。
但不敢确定,望各位大神指正!
相关文章推荐
- 关于根据指针测定一块内存所占空间大小的问题
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- 关于指针和内存的几个问题
- 转:关于指针和内存的几个问题
- 7.关于申请与释放内存new & delete
- C/C++中关于地址、指针和引用变量的学习笔记(九) : 内存结构
- 关于指针占内存情况
- 关于指针(内存)泄漏
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- 由于文件不可访问或者内存或磁盘空间不足 所以无法打开数据库"Picture"
- 关于malloc与new开辟内存空间
- 关于"猪肉涨价,内存降价。"的评论!
- 关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")
- C关于指针和内存的那些大事
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- 指针的内存解释,关于数组的讨论
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- 关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结