一、指针的概念
计算机的内存中每个存储单元都是有序的,都是按字节编码,字节是最小的存储单位。在32位编译器中,内存空间的地址最多到;而64位编译器的内存中,内存空间的地址最多到。
指针是一种数据类型,指针变量的值是另一个变量在内存中的地址。每一个变量都有一个名字,且在内存中占据一个内存位置(地址),可以通过变量名称操作内存上的值,也可以通过地址间接操作内存上的值。
例如老师在提问时可以说:“李**,你来答。”或者说:“第二排第三列的那个同学答一下。”
想得到地址,需要使用取地址符号(&)间接得到变量的地址,我们平时使用scanf时就会用到这个变量,将其放在变量之前即可生效。
图1中讲解了32位编译器与64位编译器指针的相关信息。
图2是指针的相关存储信息。
指针的定义方式:
type *poniter-name;//类型 * 指针名称
例如:
int *ip; //整型指针
double *dp; //双精度浮点型指针
float *fp; //浮点型指针
char *ch; //字符型指针
二、指针初始化方法
1.声明并出示话指针变量
double num=3;
double *NUM;//定义指向double型变量的指针NUM
NUM=# //把变量num的地址赋给指针NUM
2.声明空指针(重要‼️)
int *p=NULL;
这里,NULL是空,即0。在定义指针的时候如果不一开始就赋值的话,建议赋空,避免出错。
三、指针的相关操作
下面是指针的一些操作。
输出指针指向的地址中变量的值
cout<<*p<<endl;
使用cout输出即可,但是注意*。
指针的赋值方法
p1=p2;
这样的赋值后,p1和p2指向同样的地址,对p2的任何更改都会影响p1的值。
指针的运算方法
合法指针运算 | 不合法指针运算 | ||
√ | 指针与整数相加 | ✘ | 指针与其他变量相乘 |
√ | 指针与整数相减 | ✘ | 指针与其他变量相除 |
√ | 指针自增 | ✘ | 两指针相乘 |
√ | 指针自减 | ✘ | 两指针相除 |
√ | 同类型指针间的比较 | ✘ | 两指针相加 |
√ | 同类型指针间的相减 |
(1)指针与整数的加减
指针与证书相加减,表示指针在内存空间中向下或向上 移动整数个单位。int型每次移动4位,double型每次移动8位。
例如:假设p指向地址0x1000,则
p++ 0x1004
p+3 0x100C
(2)同类型指针间的比较
C++自带了6中比较方法
>大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于
例如:设指针p1=0x12345678,p2=0x12345679,则p1<p2。
指向结构体的指针与符号
请看下面代码
struct st1{
int a;
}s1=(st1){1};
struct st2{
int a;
str1 *p1;
}s2=(st2){2,&s1};
int main(){
st2 *p2=&s2;
cout<<p2->p1->a;
}
这其中,->用于指向结构体的指针,表示结构体内的元素。
区分一下下面的代码
int a=5;
while(a --> 1)//下降
{
cout<<a<<" ";
}
/*
输出:4 3 2 1
第2行看起来像是一个大箭头,实际上是(a--) > 1,是一个判断句。
*/
这段代码非常适合坑萌新(呵呵)。一定要看准->和-->。
以上就是本文的全部内容啦,感谢阅读!