c与指针初步理解

来源:互联网 发布:站长链接php提交实例 编辑:程序博客网 时间:2024/05/04 17:17
最近看了一下c语言,最开始对指针懂得模模糊糊的,再看一次有了新的理解。


从内存结构图可以看出指针与普通变量的的关系:
------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------




例如下面的小例子:


以下为小例子的注释:

/* int a = 1:定义一个int型变量a,并赋值1,a指向的是一块内存区域的首地
从内存来讲的释义:
首先在内存中创建一块区域,在这个区域中存储了1这个数字的值(二进制形式),并分配一个内存中首地址的编号,a中保存这个编号。
printf("%d",a)等于:调用相当于根据这个首地址,取出这一块内存区域中存储的值,
&a 等于 :取出a变量中保存的首地址的编号,也叫取地址。
*/


/* int *b:定义一个int型指针变量b,a指向的是一块内存区域的首地,这首地址所代表的内存区域中所保存的是一个指针(也就是地址,指针==地址),不能保存实际的数据,所以赋值方式只能是这样:b = &a;
从内存来讲的释义:
首先在内存中创建一块区域,在这个区域中存储了指针(也就是地址),并分配一个内存中首地址的编号,b中保存这个编号。
printf("%d",b)等于:取出b这个指针变量的首地址对应的值,取出这一块内存区域中存储的指针,取出来的是一个指针
printf("%d",*b)等于:取出b这个指针变量的首地址对应的内存区域中所保存的实际的值(也就是一个指针、地址),然后再取出这一个地址编号对应的值,
&b 等于 :取出b这个指针变量中保存的首地址的编号,也叫取地址。
取出的类型是 int **b(指针的指针)
*/


/* b = &a:取出变量a的首地址,并把这个地址赋值给指针变量b,这样b指向的就是a所代表的内存区域的地址,
  也就是说b中保存的是a的地址,并不是一个实际的值,(指针类型变量中只能保存地址)
从内存来讲的释义:
内存中有一个内存单元b,b中存储的是a的地址。所以操作*b就等于是在操作a;把a的内存地址存到b的内存单元格中:
printf("%d",b)等于:取出b这个指针变量的首地址对应的值,取出这一块内存区域中存储的指针,取出来的是一个指针;
printf("%d",*b)等于:取出b这个指针变量的首地址对应的内存区域中所保存的实际的值(也就是一个指针、地址),然后再取出这一个地址编号对应的值,这里等于取出来的是a所代表的内存单元中存储的值;
&b 等于 :取出b这个指针变量中保存的首地址的编号,也叫取地址。
取出的类型是 int **b(指针的指针)
*/
/*  *b = 2:取出指针变量b的首地址对应的内存单元中的值(就是a的地址),然后把这个地址对应的内存单元格
  中实际存储的值修改为2;
从内存来讲的释义:
内存中有一个内存单元b,b中存储的是a的地址。所以操作*b就等于是在操作a;把a的内存地址存到b的内存单元格中:
printf("%d",b)等于:取出b这个指针变量的首地址对应的值,取出这一块内存区域中存储的指针,取出来的是一个指针;
*b = 2:,等于:取出b这个指针变量的首地址对应的内存区域中所保存的实际的值(也就是一个指针、地址),然后再取出这一个地址编号对应的内存单元中值,这里等于取出来的是a所代表的,这里就是在向这个内存单元赋值,把原来的1改成2;
*/



程序代码:

#include "stdafx.h"int main(){     int a = 1;//定义int类型变量a,并初始化值为1     int *b;//定义int类型指针变量b     b = &a;// 把a所指向的内存地址赋给b这个指针变量,b所指向的内存单元中保存的就是a的地址。     *b = 2;//等价于a=2,这里实际上操作的就是a,所以a也会改变。     //通过打印下面的地址,可以观察出b中真正保存是什么,其实就是保存了a的地址。     printf("&a=%d,&b=%d,&(*b)=%d",&a,&b,&(*b));}







0 0
原创粉丝点击