指针是一个变量,其值为另一个变量的地址。就像其他变量一样,必须在使用指针存储其他变量地址之前,对其进行声明。
1、指针的声明
声明的一般形式为type *varname;它的意思是生命了一个名为varname的指针,它存储向type类型的变量的内存地址,它的作用就如同一个指向针一样,通过指针,我们可以找到它指向的量值。
2.取址运算符和取值运算符
使用指针之前,我们首先要了解一下取值运算符&,每一个变量都有一个内存地址,每一个内存地址都可以使用&变量名来访问该变量的存储地址。
同样,我们可以通过取值运算符*,来获取指针存储的内存地址所存储的值,形式为:*指针名称。
3、空指针Null
C++支持空指针。Null指针是一个定义在标准库中值为零的常量。
在声明变量是如果没有确切的地址可以赋值,为指针赋值为NULL是一个良好的编程习惯。
如需检查一个空指针,可以使用if(ptr)语句。
4、指针的算术运算
因为指针是一个数值表示的地址,因此,可以对指针执行++、--、+、-四种算术运算。每次增减其数据类型字节数。
问题:
1)为什么要给C++指针开辟空间?
我们可以看一段单链表插入结点的程序
错误示例如下图,由于我们没有给指针p指向的量开辟空间
int * p;
p的确有空间,正如一个整型变量需要占用空间一样,指针变量也要占用空间。
可关键在于这个空间存放的什么?
整型变量的空间中存放着一个整数,指针变量的空间中则存放一个地址!
任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
正确做法,
malloc是什么意思呢,malloc实在程序动态运行的时候,在堆区heap中获取一块空间。
原型如下——
#define size_t unsigned int
void * malloc(size_t size);
你传进去个size,就可以获取size个字节的空间,然后返回一个void *指针,这个指针指向了这块新分配的空间
(也就是这个指针中的地址值为这块空间的首地址)
int * p = (int *)malloc(sizeof(int));
如上是动态创建一个int变量的程序。
这样,p中存放了malloc分配的空间的首地址,继而利用这个首地址访问malloc分配的空间。
2)free指针
指针本身还在,只是它所指的内容给释放了,变成了野指针,此时不能再对它做解引用,若需要使用该指针可以给它重新分配内存。还有,指针free后,最好将它赋为NULL
1)C++指针的定义
格式:ElemType *name;表示这是一个名字为name,指向一个ElemType类型变量的指针。
2)C++指针的赋值
C++指针的值是指向的存储变量的地址,
例如:
int a = 5;
int *p=&a;//p指向a
int *p = null;
int a[5];
p =a;
3)C++指针本身的类型
4)C++指针所指向值
参见:http://www.cnblogs.com/ggjucheng/archive/2011/12/13/2286391.html
5)结构体中的指针
6)指针作为函数参数
#include <iostream>
using namespace std;
void swap(int *a,int *b)//这里的*表示参数是指针类型的参数
{
int tmp;
tmp = *a;//这里的*表示取指针a所指向地址的值
*a = *b;
*b = tmp;
cout<<*a<<endl;
cout<<*b<<endl;
}
int main()
{
int a = 1;
int b = 2;
int *p1 = &a;
int *p2 = &b;
swap(p1,p2);//p1,p2本身是指针
}
结果为: