1.指针的数据类型小结
有关指针的数据类型
2.指针的运算
a.指针变量的赋值
将变量的a的地址赋给指针p--代码如下:
int a;
int *p;
p=&a;
将数组元素的首地址赋给指针p--代码如下:
int a[3]={1,2,3};
int *p;
p=a;
将数组中的元素的地址赋给指针p
int a[3]={1,2,3};
int *p;
p=&a[2];
f为已定义的函数,将函数的入口地址赋给指针p--代码如下:
int f(int z)
{
cout<<"z"<<endl;
}
int main()
{
int f(int z);
int (*p)(int z);
p=f;
p(6666);
}
指针与指针之间的赋值,p1与p2为相同类型的指针--代码如下:
int a=2;
int *p1=&a;
int *p2=p1;
b.指针变量的赋值空值
指针变量可以赋空值,表示不指向任何变量--代码如下:
int *p=NULL;
NULL代表整数0,即就是让指针p指向地址单元为0,这样表示指针不指向任何单元,在系统中定义如下:
#define NULL 0
在C++中 include<iostream>头文件中包含了NULL的定义,NULL为符号常量。
注意:
指针p的值为NULL和p未被赋值是两个不同的概念。前者表示是有值得为0,不指向任何的变量,后者虽然未对指针p赋值并不等于
p无值,它只是一个无法预料的值,可以认为p可以指向任意一个没有被指的对象。这种情况非常的危险。因此,在引用变量之前
一定要对指针赋值。
任何指针变量或者地址都可以与NULL做相等或者不相等的比较:
if(p==NULL)
p=p1;
// 或者改写为下面的的
if(!p)
p=p1;
还需要注意:
int *p=NULL,int *p和*p=NULL的区别:
int *p=NULL和int *p上面已经说明,可以去看上面,*p=NULL表示:使p所指向的变量为0,因为p所指向的指向不确定,不适
有时候,将指针p赋值为0,养成好习惯。用用时让p=NULL。
c.指针变量的赋值应该注意的问题
基类型相同的不同的指针变量之间可以赋值,不同的基类型的变量之间不可以赋值。如下:
//错误代码
int *p1,i=2;
double *p2,j=5;
p1=&i;
p2=&j;
p1=p2;
但是可用通过强制类型可以实现上面的赋值;
p1=(int*)p2;
d.指针变量加/减一个整数
例如:
p++;
p--;
p+i;
p-i;
p+=i;
p-=i;
C/C++中规定,一个指针变量的加/减一个整数是将该指针变量的原值(原来指向的地址)和它指向的变量所占用的内存单元字节数相加或者相减。
如p+i;代表这样的地址计算:p+i*d,d是p所指向的变量单元所占用的字节数。这样才能保证p+i指向p下面的第i个元素