一、理解指针
当我们声明一个变量时,系统会在内存中分配适当的存储空间,以保存该变量的值,由于每一个字节都有唯一的地址编号,因而内存存储空间都有自己的地址编号。又由于内存地址只是编号,因而又可以把它复制给变量,这种保存地址的变量就称为指针变量。
我们并不关心指针的实际值,因为每次运行时,指针的值都会发生变化的(每次运行意味着变量重新分配地址)。
我们不能直接保存地址的值,只能利用地址运算符(&),通过保存在地址中的变量来获得地址的值。位于变量之前的地址运算符(&)将可返回该变量的地址。运算符&只能用于单个变量或数组元素。
二、指针变量的声明及初始化
由于指针变量包含的是储存某种数据类型的地址,因此在使用前必须把它们声明为指针。 例如:
int *p; //integer pointer 把变量p声明为指针变量,指向整型数据
把变量的地址赋值给指针变量的过程称为指针变量的初始化。
必须确保指针总是指向相应的数据类型。
指针可以初始化给变量,NULL,零。
指针很灵活,我们可以在不同的语句中使用同一指针指向不同的数据类型,也可以使用不同的指针指向同一数据变量。
三、通过指针访问变量
我们可以用间接运算符‘*’ (反引用运算符) 来实现对指针变量的值的访问。 例如:
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/p2、p1*p2、p1/3)。指针不能用于除法或乘法运算(p1+p2);类似地,不能对两个指针进行加法操作。
还可以使用关系运算符进行指针的的比较。诸如p1 > p2、 p1 == p2和p1 != p2都是允许的。但是,指向不同或无关联变量的指针间的比较没有意义。比较可以用于处理数组和字符串。
六、指针的递增与比例因
在指针进行递增时,所增加的值为该指针指向数据类型的“长度”。这种长度就称为比例因子(scale factor)。例如:如果p1为整形指针,初始值为2800,那么经过p1 = p1 + 1运算后p1的值为2802,而不是2801。