当咱们声明一个变量时,系统会在内存中分配适当的存储空间,以保存该变量的值,因为每个字节都有惟一的地址编号,于是内存存储空间都有本身的地址编号。又因为内存地址只是编号,于是又能够把它复制给变量,这种保存地址的变量就称为指针变量。数组
咱们并不关心指针的实际值,由于每次运行时,指针的值都会发生变化的(每次运行意味着变量从新分配地址)。指针
咱们不能直接保存地址的值,只能利用地址运算符(&),经过保存在地址中的变量来得到地址的值。位于变量以前的地址运算符(&)将可返回该变量的地址。运算符&只能用于单个变量或数组元素。code
因为指针变量包含的是储存某种数据类型的地址,所以在使用前必须把它们声明为指针。 例如:内存
int *p; //integer pointer 把变量p声明为指针变量,指向整型数据
把变量的地址赋值给指针变量的过程称为指针变量的初始化。字符串
必须确保指针老是指向相应的数据类型。编译器
指针能够初始化给变量,NULL,零。it
指针很灵活,咱们能够在不一样的语句中使用同一指针指向不一样的数据类型,也可使用不一样的指针指向同一数据变量。编译
咱们能够用间接运算符‘*’ (反引用运算符) 来实现对指针变量的值的访问。 例如:变量
int quantity, *p, n; quantity = 179; p = &quantity; n = *p;
故n==179。 特别注意:数据类型
*ptr = 25;
该语句把值25存放在地址等于ptr的值的内存中。
指向指针的指针变量必须在名称的前面添加额外的间接运算符。例如:
int **p2;
该声明语句告诉编译器 p2 是指向int类型的指针的指针。
关于指针所指变量的值的表达式;例如:若是p1和p2都是声明并初始化了得指针,那么下面的语句是合法的:
y = *p1 * *p2; //第二个 * 是运算符号 sum = sum + *p1; z = 5* - *p2/*p1; *p2 = *p2 + 10;
关于关于指针的表达式 C语言容许对指针与整数进行运算;也能够在两个指针之间进行减法运算。例如:
p1 - 2; p1 - p2;
若是 p1 和 p2 指向相同的数组,那么p2-p1将给出p1与p2之间的元素数目(p1/p二、p1*p二、p1/3)。指针不能用于除法或乘法运算(p1+p2);相似地,不能对两个指针进行加法操做。
还可使用关系运算符进行指针的的比较。诸如p1 > p二、 p1 == p2和p1 != p2都是容许的。可是,指向不一样或无关联变量的指针间的比较没有意义。比较能够用于处理数组和字符串。
在指针进行递增时,所增长的值为该指针指向数据类型的“长度”。这种长度就称为比例因子(scale factor)。例如:若是p1为整形指针,初始值为2800,那么通过p1 = p1 + 1运算后p1的值为2802,而不是2801。