C/C++学习笔记13:传递动态内存(1)

来源:互联网 发布:enum java valueof 编辑:程序博客网 时间:2024/05/29 16:59

传递动态内存其实主要考察的就是参数传递、值传递、指针传递(地址传递)、引用传递。

在这一部分内容中,除了比较下各种传递的本质,同时也增加不同类型做参数的情况,尤其是数组作为函数参数时具体的传递方案。下面运用《程序员面试宝典》中的一个例子来一一阐述:

分析:(1)swap1的情况

因此其并不能够交换值。

(2)swap2的情况:


至于swap2到底能不能进行交换,这要视编译器的不同而定,在vs2008中是不能够通过的。


(3)swap3的情况


(4)swap4的情况

函数swap4可以实现两数的交换,因为它修改的是指针所指向地址中的值。

(5)swap5的情况

这是一个引用传递,修改的结果直接影响实参。

看到此处,尤其是swap2中传过来的是地址,swap3中传递过来的也是地址,为什么一个是拷贝,另一个是指向呢?这里面理解起来比较“拗口”,但是其实的意思没有发生改变,下面将对指针中涉及的值、地址进行个基础的扩展。

为了便于理解首先弄清楚一个问题:内存单元地址与内存单元内容的区别。

对程序进行编译的时候,一般会给变量分配内存单元,编译系统根据程序中定义的变量类型,分配一定长度的空间。而内存区的每一个字节都有一个编号,这个编号就是内存地址,而在这个地址所标识的内存单元中存放数据,这个数据就是内容。


问题二:如何对内存进行访问的。

方式一:“直接访问”,这种方式就是根据变量的地址,根据变量名与地址之间的对应关系,找到变量的地址,然后从这个地址开始读取数据。即按照变量地址存取变量值的方式。

方式二:“间接访问”,这种方式其实是把地址存放在另一个变量中。

e.g, i_pointer=&i;

这个变量的i_pointer,用来存放整型变量的地址,他被分配在3010、3011两个字节。将i的地址(2000)存放到i_pointer中。

这个过程就是:首先在i_pointer中找到这个i变量的地址2000,再在2000中开始找到变量值。


问题三:如何区分&、*、变量之间的相互关系?

这其实就是区分变量的指针和指向变量的指针变量

变量的指针:其实就是这个变量的地址。就是上述中i的地址。

指针变量:存放变量地址的变量,就是上述中的i_pointer。(且指针变量只能存放地址)

*:*就是指向的意思,上述中i_pointer就是个指针变量,其指向的是i这个变量,则(*i_pointer)其实就是指向i,其与i是同一回事。(仅仅表示该变量的类型为指针变量,指针变量名为i_pointer而不是*i_pointer)

其实就是:i=3;

*i_pointer=3;

&:取地址符,&a就是a的地址。


问题四:怎样使一个指针变量指向另一个变量?

可以用赋值语句使一个指针变量指向得到一个变量的地址,从而指向一个该变量。

e.g.   int i,j;

int * pointer_1,pointer_2;

pointer_1=&i;

pointer_2=&j;

继续分析swap2与swap3的情况:



其实通俗的来说(笔者到这个的理解,不知道精准否):当有“*”的时候就有了明确的指向,交换的是一个变量值。而没有“*”时,其交换的只是一个指向。


0 0
原创粉丝点击