2012年2月28日

用双重指针做参数传递 一

  今天话了点时间想了一下用双重指针做参数传递的问题,以前一直只知道用,没有细想过为什么,今天正好有点xian。  

#include"stdio.h"

void fun(char * pa)
{
    printf("pa的值:%d\n",pa);
    pa = "bb";
    printf("pa的值:%d\n",pa);
}

int main(void)
{
char * p = 0;
 printf("p的值:%d\n",p);
     fun(p);

if(p != 0)
{
printf("改变后输出p = ");
          puts(p)
}
else
{
printf("p值未改变!\n");
}
 
     return 0;
}

结果输出"p值未改变!",分析一下不难理解:给fun函数传参的时候,其实应该是有一个隐形的操作pa=p ,这个操作和普通的两个变量赋值是一样的,把p的值赋给了pa,

然后,我们通过打印出来的值可以看到,在fun里面,pa的值原本是p的地址的,但是,pa在fun里面指向了“bb”,这样,问题就出来了,pa的值确实改变了,指向也变了,

但是,我们想要改变的p的值仍旧是”0“。

后来,我发现,p的值没有改变是因为pa改变的是他自己的值,没有改变他的指向的地址的值,但在这个例子里面作为参数的p初始化是0,也就是NULL,如果进行*pa = 'b'

这样的操作的话是非法的。    为了使操作成功,我给p赋了初值”aa“,然后进行这个操作发现仍旧不成功。原来,因为计算机的内存主要是分为:栈区、堆区、静态区、只读

区,其中,栈区,分配的是局部变量空间,比如是函数的调用,局部变量,需要执行的代码等等一些不需要我们手动分配和释放的内存;堆区,是向上增长的,主要是分配程序员申请的空间;静态分区,分配的是静态变量、全局变量;只读分区,分配的是常量和代码空间。    所以,这个操作才会失败。。


现在,来总结一些:首先,我们需要的结果是通过传递一个指针,来改变这个指针的指向的值,上面那个例子里面,传递的仅仅是一个地址值,因此,在下面的例子里面,我们需要传递的是一个完整的指针变量,我把这个指针变量的地址传进去,这就是我理解的二重指针做参数:

#include"stdio.h"

void fun(char ** pa)
{
printf("pa的值:%d\n",pa);
*pa = "bb";
printf("pa的值:%d\n",pa);
}

int main(void)
{
char * p = 0;
printf("p的值:%d\n",p);
fun(&p);

if(p != 0)
{
printf("改变后输出*p = ");
puts(p);
}
else
{
printf("p值未改变!\n");
}

return 0;
}

OK,把指针p的地址作为参数传递给fun函数,pa=&p;*pa="bb";这样就可以p的值就变成"bb"在只读区的地址了。。。

高手勿喷。。。。有错欢迎指正!

高手勿喷。。。。有错欢迎指正!

高手勿喷。。。。有错欢迎指正!


谢谢!

posted @ 2012-02-28 15:36 门牙将军 阅读(1129) 评论(19) 编辑

2012年2月2日

使用srand设置随机数种子,用来每次获取不一样的随机数

    以前一直没有仔细想过为什么如何设置随机数种子?设置随机数种子有什么用,今天有时间,拿出来分析一下:

    直接通过rand() 函数获得随机数每次都会是一样,例如,第一次程序运行的时候是8,第二次运行还会是8;后来发现有一个可以设置随机数种子的函数:srand() ,srand()的原型:

    void srand(unsigned seed);

   这个函数需要提供一个种子,使用相同的种子的话,后面的rand函数在程序第二次启动的时候就会出现一样的随机数。

例:

 1 #include "stdlib.h"
3 #include "stdio.h"
4
5 int main(void)
6 {
7    int i;
9 srand(1);
10
11 for(i = 0;i < 10; i++)
13   {
14    printf(" %d",rand()%1000);
16 }
17 return 0;
18 }

      这段代码每次启动都会输出一样的随机数:41  467 334 。。。。。 ,这样做事不符合我的初衷的,由此我想到,是不是每次程序运行srand() 时,设置的种子可以是不一样的呢,所以我使用了时间函数:

 1  #include "stdlib.h"
2 #include "stdio.h"
3 #include "time.h"
4
5 int main(void)
6 {
7   int i;
8 time_t temp_time;
9 srand((unsigned)time(&temp_time));
10
11 for(i = 0;i < 10; i++)
12   {
13    printf(" %d",rand()%1000);
14 }
15 return 0;
16 }

这样,每一次启动程序输出的随机数都是不一样的了!


posted @ 2012-02-02 15:30 门牙将军 阅读(139) 评论(1) 编辑