一重指针
指针描述了数据在内存中的位置,标示了一个占据存储空间的实体,在这一段空间起始位置的相对距离值。在C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。
注:指针只能存储同类型之间的地址,不同类型需要进行强制进制转换。
一重指针的简单操作:
#include<bits/stdc++.h>
using namespace std;
int a = 10;
int *p = &a;
二重指针
二重指针是指向指针的指针,存储指针变量的地址 。
二重指针的简单操作:
#include<bits/stdc++.h>
using namespace std;
int a = 10;
int *p = &a;
int **pt = &p;//pt = &(&a) *pt = &a, **pt = a;
cout<<pt<<endl; //输出p的地址
cout<<*pt<<endl; //输出p的值->a的地址
cout<<**pt<<endl; //输出a的值
在二重指针中, ∗ * ∗符号代表将指针指向上一个存储的值。
例:
pt存储的是pt的值,即p的地址;
*pt存储的是pt前一个的值——p的值,即a的地址。
**pt存储的是pt前一个的前一个的值——a的值。
指针和数组的关系
数组指针
注意不要将数组指针与二重指针弄混~
数组指针的简单操作,有三种赋值方法。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int *p = NULL;//未赋值之前定义为NULL,否则野指针易造成内存泄露。
//创建动态数组
p = new int[20];
//1
for(int i=0;<10;i++)
{
cin>>p[i];
}
for(int i=9;i>=0;i--)
{
cout<<p[i];
}
//2
*p = 123;
cout<<p[0];
//3
for(int i=0;i<10;i++)
{
cin>>*(p+i);
}
for(int i=9;i>=0;i--)
{
cout<<*(p+i)<<" ";
}
return 0;
}
字符串常量指针&指向字符数组的指针
注意二者不同处:
指向字符串常量的指针无法修改其内容,只能修改p指向什么位置。
指向字符数组的指针可以直接输入,并可以在输入后修改其内容 。
一些简单的操作:
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[] = "123456";
char *p = "123456";//指向字符串常量的指针无法修改其内容
// p[0] = 'x';报错
p = s; //只可以改变p保存的内容
cout<<*p;//输出第一位 *(p+1)输出第二位
cout<<p;
char *q = new char[10];//指向字符数组的指针
cin>>q;//可以直接输入 并在输入后修改其内容
cout<<q;
return 0;
}
结构体指针
注意结构体指针不能用Node.a之类,要用Node->a。
一些简单的操作:
#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
int a;
string b;
}student, *L;//L是node类型的指针
int main()
{
L x = new student;
cin>>x->a;//用指针创建变量 要用-> 不能用.
cout<<x->a;
return 0;
}