指针的初始化

来源:互联网 发布:怎么网络招生 编辑:程序博客网 时间:2024/05/16 06:15

指针代表的是内存单元的编号或地址,通过指针就可以找到对应的内存单元。对指针进行初始化或赋值的实质是将一个地址或同类型(或相兼容的类型)的指针赋给它,而不管这个地址是怎么取得的。

  1、指针的初始化

  指针初始化时,“=”的右操作数必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是int*p=0;除外,该语句表示指针为空)。

  对指针进行初始化时常用的有以下几种方式:

  1.采用NULL或空指针常量,如:int *p = NULL;或 char *p = 2-2; 或float *p = 0;

  2.取一个对象的地址然后赋给一个指针,如:int i = 3; int *ip = &i;

  3.将一个指针常量赋给一个指针,如:long *p = (long *)0xfffffff0;

  4.将一个T类型数组的名字赋给一个相同类型的指针,如:char ary[100]; char *cp = ary;

  5.将一个指针的地址赋给一个指针,如:int i = 3; int *ip = &i;int **pp = &ip;

  6.将一个字符串常量赋给一个字符指针,如:char *cp = “abcdefg”;

  ANSI C定义了零指针常量的概念:一个具有0值的整形常量表达式,或者此类表达式被强制转换为void *类型,则称为空指针常量,它可以用来初始化或赋给任何类型的指针。也就是说,我们可以将0、0L、'/0'、2–2、0*5以及(void *)0赋给一个任何类型的指针,此后这个指针就成为一个空指针,由系统保证空指针不指向任何对象或函数。

  ANSI C还定义了一个宏NULL,用来表示空指针常量。大多数C语言的实现中NULL是采用后面这种方式定义的:#define NULL ((void *)0)。

  例如:

  int a = 25;

  int *ptr = &a;

  int b[10];

  int *point = b;

  int *p = &b[0];

  2、指针的赋值

  int *p;

  int a;

  int b[1];

  p = &a;

  p = b;

  指针的赋值,“=”的左操作数可以是*p,也可以是p。

  当“=”的左操作数是*p时,改变的是p所指向的地址存放的数据;

  当“=”的左操作数是p时,改变的是p所指向的地址。

  常见错误:

  如果:int *p;

  *p = 7;

  则编译器(vs2008)会提示The variable 'p' is being used without being initialized.即使用了未初始化的变量p。

  因为p是指向7所在的地址,*p = 7给p所指向的内存赋值,p没有赋值,所以p所指向的内存位置是随机的,没有初始化的。

  int k;

  int *p;

  p = &k; //给p赋值

  *p = 7; //给p所指向的内存赋值,即k= 7

  数组的变量名b表示该数组的首地址,因此p=b;也是正确的

  同类型的指针赋值:

  int val1 = 18,val2 = 19;

  int *p1,*p2;

  p1 = &val1;

  p2 = &val2;

0 0