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