c指针总结

来源:互联网 发布:br软件 编辑:程序博客网 时间:2024/05/29 03:51

2009-8-5

 Void 函数的含义:

      字面是无类型,void *是无类型指针。Void *可以指向任何类型的数据。

不可以这样定义: void a; 这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a的编译不会出错,它也没有任何实际意义。

       void真正发挥的作用在于:

1 对函数返回的限定;

2 对函数参数的限定。

如果p1p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型.

float *p1;

 

int *p2;

 

1 = p2;

 

其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”,必须改为:

 

1 = (float *)p2;

 

void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:

 

void *p1;

 

int *p2;

 

1 = p2;

Void 函数。

void *avc(void )

{

    Int a;

    Return &a;//是错误的,应该写成return (void *)&a

}

    

 

 

 

 

 

 

 

 

 

常量指针,指针常量  

1 常量指针!如 int b, c; int * const a = &b;

表示a是一个常量指针它指向变量b的内存。但是因为是常量指针所以不能再用a指向其他变量,如 a = &c; 错误!可以修改指向内存的值,如:*a = 20; BTW 常量指针声明的时候必须向我那样赋初值。

2 指向常量的指针!如 int b, c; int const *a; a = &b; a = &c;

都可以,唯独它指向的内存不能被修改。如:*a=20;这是违法的!错误!

如何区分:

const关键字,它后面的不可以修改,

int *const a =&b,const后面是a,则说明a 不能修改。

int const *a = &b,后面是*a则说明*a 不可修改!

 

可以写成int const  const int  是一样的。

 

总结:

1.  对于常量(符号常量)和常指针、常引用常对象声明都是一样的

定义格式: const 数据类型  常量名=常量值;

  数据类型 const 常量名=常量值;

 

例如:const int a=7; int const a=7;(符号常量)

 int b=5; 

const int *p=&b;  int const *p=&b;(常指针)

const int &m=b;(常引用)

const Point pt; Point const pt; //常对象不能更新

常指针和常引用在功能上有所限制,就是不能通过他们更改其指向的变量的数据(值)

 

2. 指针常量

定义格式: 数据类型 *const 指针常量=常量值;

char ch,*const pch=&ch;(我是一步完成的,你也可以分开)

也就是说这个指针本身是个常量,不可改变,即它所指向的地址是固定的。但,ch是可以改变的。

常量指针常量

定义如下:

Cont int * const p4=&a;

 

作用:

做为函数形参时,在调用函数时可保护对引用内存单元的数据不被修改。

例如:

Int char(cont int *p,cont int *q)

   {

     *p=200;      //错误

    int *pb=(int *)p

     *pb=600;     //正确

}

传值调用和传引用调用有什么相同

1.传值调用又分为数据传值调用和地址传值调用。数据传值调用方式是将实参的数据值传递给形参。实参和形参在栈空间内的地址不相同,改变形参值不影响实参值;地址传值调用方式是将实参的地址值传递给形参,实参和形参在栈空间内共用同一地址,改变形参值就可改变实参值。

2.引用调用是将实参变量值传递给形参,而形参是实参变量的引用名。引用是给一个已有变量起的别名,对引用的操作就是对该已有变量的操作。引用调用可以起到地址传值调用的作用,即改变形参值就可改变实参值。引用调用比地址传值调用更为简单,在C++较多地使用引用调用代替地址传值调用。

 

 

Srand(unsigined int seed);

1

这个函数就是用来"播种".通过一个"种子"(SEED),来控制随机数的序列不一样.只要种子不一样,那么通过rand()得到的随机数序列就不一样.反过来说,如果种子一样,那么通过srand()得到的随机数就是一样的.

 

srand(0);

for( int i = 0; i < 10; i++)

{

cout<<rand()<<' ';

}

 

你试着将这个程序执行两次,你会发现两次的结果一样。那是因为,一旦“种子”确定了,那么这个随机数序列就确定了。软件天生的“行为可重复性”决定了这一点。

 

所以,一般在播种的时候,喜欢用一个随机的种子.在绝大多数的情况下,会使用当前的系统时间.这个数字在每次程序运行的时候都不一样.除非你手动的改系统时间.

2

srand函数是随机数发生器的初始化函数,原型:

  void srand(unsigned seed);

  它需要提供一个种子,如:

  srand(1);

  直接使用1来初始化种子。

  不过常常使用系统时间来初始化,即使用

  time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970

  到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数,即:

  srand((unsigned) time(&t));

  还有一个经常用法,不需要定义time_tt变量,即:

  srand((unsigned) time(NULL));

  直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的t数据。

  srand((int)getpid());

  使用程序的ID(getpid())来作为初始化种子,在同一个程序中这个种子是固定的

  随机输出十个0-100之间的整数

  #include <stdlib.h>

  #include <stdio.h>

  #include <time.h>

  void main( void )

  {

  int i,k;

  srand( (unsigned)time( NULL ) );

  for( i = 0; i < 10;i++ )

  {

  k=rand()%100;

  printf( " k=%d/n", k );

  }

  }

原创粉丝点击