指针的用法

我们知道,变量前面加上&就是变量的取地址,而*是变量的地址。

* 代表的是地址。

int* a = new int[10]; // 意思是,系统分配了连续的一片内存用来存储int型数据,a是这片内存的起始地址。
*a = 10;// 意思是将这片连续内存的第一块内存中的数据存储为10;

& 意思是取地址

int b = 1;  //初始化int型数据b的值为1;
&b  //数据b的内存地址。 

注意

  1. 上述代码中的 a 本身就是个 地址 。
  2. 上述代码中的 *a 代表的是存储在内存 地址a 上的 数据 。
  3. 上述代码中的 b 本身就是存储在内存上的数据。
  4. 上述代码中的 &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类型指针,还有其他的类型也可以,比如charfloat……

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值