初学指针总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

指针知识基础总结
1.基础知识
#include<stdio.h>
int main(void)
{
int *p;
/*
p是变量的名字,int*表示P变量存放的是int 类型变量的地址.如果定义为double *p;则p变量只能存放double类型变量的地址。

2、int* p,不表示定义了一个名字叫*p的变量。

应该理解为:p是变量名,p变量的数据类型是int*类型,所谓int*类型实际就是存放int变量地址的类型
*/
int i = 3;
p = &i;
/*
1、p保存了i的地址,因此p指向i
2、p不是i,i也不是p,更准确的说,修改p的值不影响i的值,修改i的值也不影响p的值。

3、指针变量就是存放地址的变量。

指针就是地址。

4、如果一个指针变量指向了某个普通变量,则*指针变量就完全等同于普通变量。

例子:
如果p是个指针变量,并且p存放了普通变量i的地址,则p指向了普通变量i,*p 就完全等同于i。

或者说:在所有出现*p的地方都可以
5、*p代表以p的内容为地址的变量。

*/
j = *p;
printf("i = %d\n, j = %d\n",i,j);
return 0;
}
2、指针相减的问题
/*
2013年1月25日14:05:52
*/
#include<stdio.h>
int main()
{
int a[5] = {1, 2 ,3 ,4 ,5};
int *p = &a[0];
int *q = &a[1];
int i;
//int *i;//error
i = p-q;
printf("%d\n",i);//i = 1,而不是等于4;
printf("%d,%d\n",q,p);
return 0;
}
/*
1、对于指向数组的指针变量,可以加上或减去一个整数n。

设pa是指向数组a的指针变量,则pa+n,pa-n,pa++,++pa,pa--,--pa运算都是合法的。

指针变量加或减一个整数n的意义是把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置。

应该注意,数组指针变量向前或向后移动一个位置和地址加1或减1在概念上是不同的。

因为数组可以有不同的类型,各种类型的数组元素所占的字节长度是不同的。

如指针变量加1,即向后移动1 个位置表示指针变量指向下一个数据元素的首地址。

而不是在原地址基础上加1。

例如:
int a[5],*pa;
pa=a; /*pa指向数组a,也是指向a[0]*/
pa=pa+2; /*pa指向a[2],即pa的值为&pa[2]*/
2、指针变量的加减运算只能对数组指针变量进行,对指向其它类型变量的指针变量作加减运算是毫无意义的。

3、两个指针变量之间的运算:只有指向同一数组的两个指针变量之间才能进行运算,否则运算毫无意义。

4、两指针变量相减:两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。

实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。

例如pf1和pf2是指向同一浮点数组的两个指针变量,设pf1的值为2010H,pf2的值为2000H,而浮点数组每个元素占4个字节,所以pf1-pf2的结果为(2000H-2010H)/4=4,表示pf1和 pf2之间相差4个元素。

5、两个指针变量不能进行加法运算。

例如,pf1+pf2是什么意思呢?毫无实际意义。

6、两指针相减得到的数据类型以int型存储,而不是以指针类型(int*)存储。

*/
3、空指针的问题
指针变量还可以与0比较。

设p为指针变量,则p==0表明p是空指针,它不指向任何变量;
p !=0 表示p不是空指针。

空指针是由对指针变量赋予0值而得到的。

例如:
#define NULL 0
int *p=NULL;
对指针变量赋0值和不赋值是不同的。

指针变量未赋值时,可以是任意值,是不能使用的。

否则将造成意外错误。

而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。

详细可参考一般叫做《让你不再害怕指针》的一本书。

相关文档
最新文档