关于地址的一些有关问题

关于地址的一些问题
这是这星期整理的还没弄明白的地方,由于还没买操作系统的书,所以对底层的东西并不是很了解明白,求教啦!
--->1: 地址和具体值是怎么绑定的?
--->2: 使用 printf("%4d",a[i]); 的时候,a[i]的运算位置( 使用数组输出的时
  候.会进行地址运算,先找到a (即a[0]) 的地址,通过数组下标进行地址运
  算,再找到a[i]的地址所存的值( 我现在不确定是找到地址为止 ,还是找
  到其具体值)),
  (1)如果是找到其具体值,那么 %d 中 d 的作用是不是控制具体值的二
  进制数的长度?
  (2)如果是地址呢?假定地址和具体值是这样绑定的:00011111111(前
  面三个0是地址,后面的 1 是其具体)那么 d 的作用是不是从地址结束开
  始取长度?
--->3: 使用赋值的时候,比如上面的:p=a;p里存的是数组a的地址,但 p 和 a 
  是分配在不同的地址上?(我现在是认为)
--->4: int *p;
  p=10; --------------1
  p="hello would!!!" --------------2
  指针变量p在1中存的是10,而在2中存的是"hello would!!!"的地址?
  是因为 " " 会进行运算么?先将 hello would!!! 存储,再引用其地址?
--->5: 指针使用完,要怎样释放?为什么要释放?没释放会出现哪些严重的问题?

------解决方案--------------------
第4个: 
对于一个指针变量,唯一可以显示的给定地址的只有0,也就是NULL,所以不能写p=10;另外,p是int*,所以p="hello,world!"也是有问题的,会给warning,应该是是char*为好。
"hello, world!"是一个字符串,不会存在栈中,所以说地址没有意义吧,因为只能通过p去访问而不能更改。

第五个:
C中用free,c++中用delete。如果不释放的话,可用内存会越来越小。对于一个长时间运行的程序就可能会由于没有足够的内存出现问题。实际上,即使不释放内存,一旦程序结束,操作系统也会释放掉程序占用的内存。

第三个:
是的。p=a,就是让p的内容里存放数组a的首地址。
------解决方案--------------------
关于地址和值,是没用绑定机制的。
把内存划分成许多个基本的单元(字节),每个字节都有一个唯一的编号,就是地址。而字节的内容,二进制数码,就是值。至于具体的这些二进制数码到底是什么,就要看不同的编码规则了,整型、浮点、定点、字符都是不一样的。
所以说,一个地址就是直接对应于一个值,不存在把一个地址和一个值放到一起进行绑定的过程
------解决方案--------------------
楼主没搞清楚指针和地址。看看C和指针

--->1: 地址和具体值是怎么绑定的?
地址即使标明一个内存单元的位置,值就是那个内存单元的内容。
--->2: 使用 printf("%4d",a[i]); 的时候,a[i]的运算位置( 使用数组输出的时
候.会进行地址运算,先找到a (即a[0]) 的地址,通过数组下标进行地址运
算,再找到a[i]的地址所存的值( 我现在不确定是找到地址为止 ,还是找
到其具体值)),
(1)如果是找到其具体值,那么 %d 中 d 的作用是不是控制具体值的二
进制数的长度?

d的作用是表示按照int格式型输出a[i]内存中的内容
(2)如果是地址呢?假定地址和具体值是这样绑定的:00011111111(前
面三个0是地址,后面的 1 是其具体)那么 d 的作用是不是从地址结束开
始取长度?

  你理解错了,地址是地址,值是值。
比如说 地址是某个房间 而值是房间中的内容
--->3: 使用赋值的时候,比如上面的:p=a;p里存的是数组a的地址,但 p 和 a
是分配在不同的地址上?(我现在是认为)
 
是的 p和a都有自己的地址和值,p的地址是自己的地址,值时a的地址。p和a在不同地方。
--->4: int *p;
p=10; --------------1
p="hello would!!!" --------------2
指针变量p在1中存的是10,而在2中存的是"hello would!!!"的地址?
是因为 " " 会进行运算么?先将 hello would!!! 存储,再引用其地址?

这个好像是

--->5: 指针使用完,要怎样释放?为什么要释放?没释放会出现哪些严重的问题?

应该是指针指向的而且是自己所申请的内存要释放,不释放会浪费、内存泄露
------解决方案--------------------
楼主再好好看看指针的介绍 看国外的书比较好
------解决方案--------------------
<---1
地址对应的是存储单元,存储单元中存储的是具体值,实际上地址在内存中并不存在,它只是操作系统给内存单元的编号而已
<---2
(1)找到值是用户看到的,找到地址,再取值是内部的,至于%d中的d,指的是decimal,十进制的整数而已,这与printf的实现有关,和数组的下标运算无关,别纠结这个问题。关于printf的更多用法,请参考手册。
(2)为什么lz老是觉得什么东西都该绑定在一起?
<---3
使用赋值的时候,比如上面的:p=a;p里存的是数组a的地址,但 p 和 a 
是分配在不同的地址上?(我现在是认为)
指针变量的值本质上都是整数,那就是说,p = a; 也就相当于p里面存了个整数,可以根据这个数找到数组a的首地址而已,这和p与a是否分配在相同的地址上有关系吗?如果p和a真分配在相同的地址,那二者只能存活一个了
<---4
""并不能进行运算,是C编译器将"hello, world!!!"这个串放在了常量区,将这个串的首地址赋值给p,不过要强制类型转换

------解决方案--------------------
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”