黑马程序员 ------- 指针的基础知识

时间:2023-02-19 15:49:54

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

指针提供了一种用来使用地址的符号方法。由于计算机的硬件指令很大程度上要依赖于地址,所以指针使你能够以类似于计算机底层的表达方式来表达自己的意愿。这使得使用了指针的程序能够更高效的工作。指针能够很有效的处理数组。数组标记实际上是一种变相使用指针的形式。如:str == &str[0],数组名同时也是该数组元素的地址。
str与&str[0]都代表首元素的内存地址。两者都是常量,在程序的运行过程中他们保持不变。然而可以把他们作为赋给指针变量的值,然后你可以修改指针变量的值。
如下面代码:
#include <stdio.h>
#difine SIZE 4
int main (){

short dates[SIZE];
short *pti;
short index;
double bills[SIZE]
double *ptf;
pti = dates;
ptf = bills;
for(index = 0;index < SIZE;index ++)
     printf("pointers + %d:%10p\n",index,pti+index,ptf + index);

     return 0;
     }
我们的系统是按字节编址的,但是short类型使用两个字节,double类型使用八个字节。**在C中,对一个指针+1的结果是对该指针增加1个存储单元。对于数组而言,地址会增加到下一个元素的地址,而不是下一个字节。**这就是为什么在声明指针时必须声明他所指向的对象的类型。计算机需要知道存储对象所用的字节数,所以只有地址信息是不够的(即使指针是指向标量的,也需要声明指针类型,否则操作不能正确返回数值)。

这里举两个比较容易混淆的例子
*(str +2);
    *  str +2;
   这两个用法看起来很相似,但是*(str +2)表示的是str的第三个元素的值,而*str+2 表示的则是 str 的第一个元素的值和二相加。间接运算符(*)的优先级高于+,我们使用指针时要额外注意括号,所谓一扩差万里。
    数组与指针有着密切的关系,可以用指针标示数组的每个元素,并得到每个元素的值。
理解了数组和指针的关系,编程的时候就可以方便的选择两者中任意一种方法。
C提供了几种基本的指针操作。
1)赋值
可以把一个地址赋给指针。通常使用数组名或地址运算符&来进行地址赋值。注意:地址应该和指针类型兼容。
2)求值或取值
运算符*可以取出指针指向地址中存储的数值。
3)取指针地址
指针变量同其他变量一样具有地址和数值,使用运算符&可以得到存储指针本身的地址。
4)将一个整数加给指针
   可以使用+运算符来把一个整数加给一个指针,或者把一个指针加给一个正数。两种情况下,整个整数都会和指针所指类型的字节数相乘,然后所得的结果会加到初始地址上。如果相加的结果超出了初始指针所指向的数组的范围,那么这个结果是不确定的,除非超出数组最后一个元素的地址能够确保是有效地。
5)增加指针的值
可以通过一般的加法或增量运算符来增加一个指针的值。对指向某数组元素的指针做增量运算,可以让指针指向该数组的下一个元素。
6)从指针中减去一个整数
可以使用 - 运算符来从一个指针中减去一个整数。指针不许是第一个操作数,或者是一个指向整数的指针。这个整数都会和指针所指向的字节数相乘,然后所得的结果会从初始地址中减去。
7)减小指针的值
指针当然也可以做减量运算。
8)求差值
可以求助两个指针间的差值。通常对分别指向同一个数组内两个元素的指针求差值,以求出元素之间的距离。差值的单位是相应类型的大小。
9)比较
可以使用关系运算符来比较两个指针的值,前提是两个指针具有相同的类型。


  在进行指针的增量和减量运算时,需要牢记一些注意事项。计算机不会检查指针是否仍然指向某个数组元素。C保证指向数组元素最后的第一个地址的指针都是有效地。但是如果指针在进行了增量或减量运算后超出了这个范围,后果将是未知的。另外,可以对指向一个数组元素的指针进行取值运算。但不能对指向数组后的第一个地址的指针进行取值运算,尽管这样的指针是合法的。