(壹) 指针变量
小樽C++ 多章⑧ (贰) 指针与数组https://blog.csdn.net/weixin_44775255/article/details/129396791
小樽C++ 多章⑧ (叁) 指针与字符串、(肆) 函数与指针https://blog.csdn.net/weixin_44775255/article/details/129397866
C++ (壹) 指针变量
小明想把从李华家借来的书——《CCF中学生计算机程序设计》还给李华,但李华不在家,于是把书放到书架第3层的最右边,并写了一张留言条放在桌上,上面写着:我还你的书放在书架第3层最右边。当李华回来后,看到这张留言条就知道书在哪了。
这张留言条有什么作用呢?
它就相当于一个指针,上面的内容不是书本身,而是书的位置,李华通过留言条(指针)找到了小明还回来的书。
指针针对的是内存空间的位置(地址),地址操作符 <--> &
int a=3; 请问如何找到a值为3的地址位置呢?
#include<iostream>
using namespace std;
int main(){
int a=3;
cout<<&a<<endl;
a=4;
cout<<&a<<endl;
int b=3;
cout<<&b<<endl;
return 0;
}
- 可以发现,变量a的地址无关赋值多少!!!
- 不同变量的内存空间地址是不一样的!!!
一、指针的概念与定义
指针定义:变量类型 *p; --》int *p = new(int); //申请一个空间给p,*p内容不确定。
int *p = NULL;
定义了一个指针变量p,p指向一个内存空间,赋值为NULL也就是0,表示特殊的空地址。
二、给指针变量p赋值
p=&a; //把变量a存值的地址给p,注意p是地址,指针*p的值才是3。
炼1.输入两个不同的浮点数,通过指针把最大值+10,并输出。
#include<iostream>
using namespace std;
int main(){
float a,b,*p;
cin>>a>>b;
if(a>b){
p = &a;
}
else{
p = &b;
}
*p += 10;
cout<<*p<<endl;
return 0;
}
三、指针变量的的+、-运算
炼2:输入n个整数,使用指针变量访问输出
#include<iostream>
using namespace std;
int main(){
int n,a[100],*p;
cin>>n;
for(int i=0;i<n;i++){ //输入
cin>>a[i];
}
p = &a[0]; //初始赋值
for(int i=0;i<n;i++){
cout<<*p<<" ";
p++; // p++指的是对地址+sizeof(int)
}
return 0;
}
假如指针 p = &a[0];
那么请问 *p+3 是什么意思? *(p+3) 呢?
*p代表值 *p+3代表值+3; *(p+3) p代表地址 ,p+3 代表地址+3
int a[1000];
p = &a[5];
p++ 相当 a[6]
练习:*p+3相当 a[5]+3 ;*p-2相当 a[5]-2 ; *(p-2)相当 a[3] 。
四、无类型指针
有时候我们不确定 指向内容的值类型。所以先定义无类型的指针(void *p),根据后面再强制转换指针类型。
炼3:无指针使用样例
#include<iostream>
using namespace std;
int a=10;
double b=3.5;
void *p;
int main(){
p = &a;
cout<< *((int *)p)<<endl;
p = &b;
cout<< *((double *)p)<<endl;
return 0;
}
五、多重指针
有一个问题,既然指针可以指向其他类型或强制转换,那指针本身就是一种类型,那谁可以指向指针? 当然是指针的‘指针’,也就是多重指针!!!
炼4:两重指针使用样例。
#include<iostream>
using namespace std;
int a=10, *p;
int **pp;
int main(){
p = &a;
pp = &p;
cout<<a<<"="<<*p<<"="<<**pp<<endl;
return 0;
}