0
点赞
收藏
分享

微信扫一扫

指针的用法

栖桐 2022-01-27 阅读 108

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

* 代表的是地址。

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……

举报

相关推荐

0 条评论