我们知道,变量前面加上&
就是变量的取地址,而*
是变量的地址。
*
代表的是地址。
int* a = new int[10]; // 意思是,系统分配了连续的一片内存用来存储int型数据,a是这片内存的起始地址。
*a = 10;// 意思是将这片连续内存的第一块内存中的数据存储为10;
&
意思是取地址
int b = 1; //初始化int型数据b的值为1;
&b //数据b的内存地址。
注意
- 上述代码中的
a
本身就是个 地址 。 - 上述代码中的
*a
代表的是存储在内存 地址a 上的 数据 。 - 上述代码中的
b
本身就是存储在内存上的数据。 - 上述代码中的
&b
是存储在内存上的数据b的内存地址。
指针详解视频 点击链接
如果视频不能正常打开,我可以用图文并茂描述。
代码如下
#include<iostream>
using namespace std;
int main()
{
int a=2333;
int *p;
p=&a;
cout<<"&a:"<<&a<<endl;
cout<<"p:"<<p<<endl;
cout<<"*p:"<<*p<<endl;
cout<<"&(*p):"<<&(*p)<<endl;
return 0;
}
调试结果如下
&a:0x61fe14
p:0x61fe14
*p:2333
&(*p):0x61fe14
我们发现,如果指针`p`指向`a`之后呢,`&a`表示a的取地址,其值跟`p`一样,也跟`&(*p)`一样。
我们可以假设,*
像变量(或指针)的“下一级”,&
像变量(或指针)的“上一级,如果&
和*
各一个同时出现,就“抵消”了。
int *p;
p=&a;
这两行代码可以这样简写成一行。
int *p=&a;
我们在看下例子,如果要修改指针的值,指向的变量会不会随着改变?
#include<iostream>
using namespace std;
int main()
{
int a=2333;
int *p;
p=&a;
cout<<"&a:"<<&a<<endl;
cout<<"p:"<<p<<endl;
cout<<"*p:"<<*p<<endl;
*p=3333;
//修改指针p的值就是修改a的值
cout<<"*p=3333;"<<endl;
cout<<"a:"<<a<<endl;
cout<<"&a:"<<&a<<endl;
cout<<"p:"<<p<<endl;
cout<<"*p:"<<*p<<endl;
return 0;
}
调试结果后
&a:0x61fe14
p:0x61fe14
*p:2333
*p=3333;
a:3333
&a:0x61fe14
p:0x61fe14
*p:3333
看到这样结果,不管数值怎么改变,只要指针指向不动,地址是不会改变的。
指针p数值变化,被指针指向的变量也会随着改变。
再看看数组指针怎么使用。
#include<iostream>
using namespace std;
int main()
{
int a[5]={0,2,5,9,13};
int *p;
p=a;
cout<<"a:"<<a<<endl;
cout<<"&a:"<<&a<<endl;
cout<<"p:"<<p<<endl;
cout<<"*p:"<<*p<<endl;
cout<<"*p+2:"<<*p+2<<endl;
cout<<"*(p+2):"<<*(p+2)<<endl;
cout<<"a[2]:"<<a[2]<<endl;
return 0;
}
调试结果后如下
a:0x61fe00
&a:0x61fe00
p:0x61fe00
*p:0
*p+2:2
*(p+2):5
a[2]:5
注意,如果定义好的数组,要定义指针指向的数组变量,不能这样写成int *p=&a;
正确写法应该是
int a[5]={0,2,5,9,13};
int *p;
p=a;
或者可以这样写
int a[5]={0,2,5,9,13};
int *p=a;
如果要利用指针来修改数组,也很简单。
以数组a
下标为2的元素改成50,代码如下
#include<iostream>
using namespace std;
int main()
{
int a[5]={0,2,5,9,13};
int *p=a;
cout<<"修改数组a下标为2的元素:50"<<endl;
cout<<"遍历数组"<<endl;
*(p+2)=50;
for(int i=0;i<5;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
调试结果如下
修改数组a下标为2的元素:50
遍历数组
0 2 50 9 13
除了int
类型指针,还有其他的类型也可以,比如char
、float
……