C++ 指针
一、变量的内存地址(变量放在哪里)
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:
#includeusing 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++ 中使用指针
使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。下面的实例涉及到了这些操作:#includeusing namespace std; int main() { int a; int * pa; a=19; cout< 运行结果
19
0x22fed8
0x22fed8
19
注意pa本身也有内存地址#includeusing namespace std; int main() { int a; int * pa; a=19; cout< 19
0x22fedc
0x22fedc
19
0x22fed8//pa的内存地址
四、结构体指针
指向结构体类型的指针#includeusing namespace std; struct node{ int x; int y; }; int main() { node *npa; npa=new node;//指针的初始化 cin>>npa->x>>npa->y; cout< x<<" "< y< 五、指针的初始化与运算
#includeusing namespace std; int main() { int *pa,*p; cout< 六、单链表
#includeusing 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 */ 单链表的函数实现
/* 指针的引用 */ #includeusing 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<