指针的初始化
指针代表的是内存单元的编号或地址,通过指针就可以到对应的内存单元。对指针进⾏初始化或赋值的实质是将⼀个地址或同类型(或相兼容的类型)的指针赋给它,⽽不管这个地址是怎么取得的。
  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;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。