C++ 指针


一、变量的内存地址(变量放在哪里)
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:

#include
using namespace std;
int main()
{
	int a;
	a=19;
	cout<

运行结果

19
0x22fedc   //变量a的首地址

在计算机中,内存空间是按字节进行编址,即每8个位都有一个地址。不同类型的数据占用的内存大小不一样,如int占4字节,上例中a占用从0x22ffedc开始的4个字节。
内存地址是16进制的。

二、什么是指针?
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
type *var-name;
在这里,type 是指针的基类型,它必须是一个有效的 C++ 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。以下是有效的指针声明:
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

三、C++ 中使用指针
使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。下面的实例涉及到了这些操作:

#include
using namespace std;
int main()
{
	int a;
	int * pa; 
	a=19;
	cout<

运行结果

19
0x22fed8
0x22fed8
19
注意pa本身也有内存地址

#include
using namespace std;
int main()
{
	int a;
	int * pa; 
	a=19;
	cout<

19

0x22fedc
0x22fedc
19
0x22fed8//pa的内存地址
四、结构体指针
指向结构体类型的指针

#include
using namespace std;
struct node{
	int x;
	int y;
};
int main()
{
	node *npa;
	npa=new node;//指针的初始化 
	cin>>npa->x>>npa->y;
	cout<x<<" "<y<

五、指针的初始化与运算

#include
using namespace std;
int main()
{
	int *pa,*p;
	cout<

六、单链表

#include
using namespace std;
struct node
{
	int val;
	node *next;	
};
int main()
{
	node *p=NULL,*v;
	int n;
	cin>>n;
	for (int i=1;i<=n;i++)
	{
		v=new(node);
		cin>>v->val;
		v->next=p;
		p=v;
	}
	node *l;
	for (l=p;l;l=l->next)
	{
		cout<val<<" ";
	}
}
/*
in
5
4 8 7 2 3
out
3 2 7 8 4
*/

单链表的函数实现

/*
指针的引用 
*/
#include
using namespace std;
struct node
{
	int val;
	node *next;	
};
void add(node *&p,int x)
{
	node *v;
	v=new(node);
	v->val=x;
	v->next=p;
	p=v;
	return ;
}
void list(node *l)
{
	for (;l;l=l->next)
	{
		cout<val<<" ";
	}
}
int main()
{
	node *p=NULL;
	int n;
	cin>>n;
	for (int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		add(p,x);
	}
	/*
	node *l;
	for (l=p;l;l=l->next)
	{
		cout<val<<" ";
	}
	*/
	list(p);
	cout<