指针表示存储器单元的编号或地址,通过指针可以找到对应的存储器单元。 初始化或分配指针的本质是分配地址或相同类型(或兼容类型)的指针,而不管地址是如何获取的。
1、指针初始化
初始化指针时,“=”的右操作数必须是内存中数据的地址,不能是变量,不能直接使用整数地址值(但此语句指示指针为空)。
初始化指针时常用的方法是:
采用空值或空指针常数。 例如int *p=NULL; 或char *p=2-2; 或浮动* 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 '、22、0*5和(void * ) 0指定给任何类型的指针。 然后,该指针将是空指针,系统将确保空指针不指向任何对象或函数。
ANSI C还定义了表示空指针常量的宏空值。 在大多数c语言实现中,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 ' isbeingusedwithoutbeinginitialized .即使使用未初始化的变量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;