C++ 地址和指针

C++ 地址和指针

在选择中迷失自我

C++ 地址和指针

开发工具与关键技术:C++、VisualStudio
作者:何任贤
撰写时间:2019年04月10日
  • 1
  • 2
  • 3
C++的地址并不是我们日常生活中的地址,那么它是什么呢,它是指我们内存中地址,就内存的位置,我们C++中的变量,常量都是有自己地址的,不过只有有标识的才有地址,下面我们输出一下常量和变量的地址。
  • 1

#include 
using namespace std;
void main()
{
const int a = 10; int b = 10;
cout << “a的地址:” << &a << “\n”
<< “b的地址:” << &b << “\n”;
}
这是代码,&符号在这里是取地址的意思,就是获取该标识所在内存地址的意思。下面它们的地址.
在这里插入图片描述

地址既然是它们所在内存的位置标识,那么我们是不是下一次就可以通过这个地址来获取a和b的值呢?其实并不可以,因为只有在程序运行的时候编译器才会给它们分配内存,所以并不是,每次内存分配都是不一样的,那么在程序运行时可不可以改变标识的地址呢?其实并不可以,为什么呢?因为地址本来就是一开始就分配好,那么我们只能改变地址存储的值,而不是地址,为了验证每次内存分配都是不一样的,我们下面有代码和结果,至于改变某个标识的地址,这个C++没有相关代码。
在这里插入图片描述在这里插入图片描述
我们通过结果可以知道,编译器每一次分配的内存都是不一样的,不管它是常量还是变量,既然每一次都是不一样的地址,那这个地址有什么用呢?我们可以看一下标题,地址和指针,为什么是地址和指针,很简单指针就是用来操作地址的,指针也是一种数据类型,它是用来存储地址的,它可以通过地址来获取该地址的值,那么它怎么获取,为什么只有指针可以通过地址获取地址的值呢?下面我们来看代码和结果。
#include 
using namespace std;
void main()
{
int a = 10; int *b ;
b = &a;
cout << “a的地址:” << &a << " a的值:" << a << “\n”
<< “指针b的值:” << b << " 指针b解地址:" << *b << “\n”
<< " 指针b的地址:" << &b << “\n”;
}
在这里插入图片描述
通过代码和结果我们看到指针b的值和a的地址是一样的,这就是为什么我说指针是用来存储的地址的,指针b解地址,解的是那个地址呢,解的是它存储的地址而不是它的自己的地址,它地址解出来的和a的值是一样,上面我们还说过只有指针才能解地址是吧,我们看下面的截图就知道了。(*符号在变量声明时是修饰该变量是一个指针,在非声明时一般是解址符)
在这里插入图片描述
在截图中我给a赋了上面的地址值,加上0x是表示该值是一个十六进制的数,地址是以十六进制显示的,然后我尝试对a进行解地址,编译器就报错了,这错的意思解址符的操作对象必须是指针。
那么指针操作的是地址一个变量就一个地址,并不能显示指针对地址的操作,那么什么凸显指针对地址的操作呢,这个时候我们要加入一个数组,为什么是数组呢?因为数组在内存中是一片连续的内存,虽然不只数组一个可以体现,但是数组大家都比较熟悉。下面数组的下标操作和指针对数组的操作。
#include 
using namespace std;

void main()
{
int a [10]; int *b;
for (int i = 0; i < 10; i++)
{
a[i] = i;
}
for (int i = 0; i < 10; i++)
{
cout << a[i] << " " ;
}
cout << “\n”;
}
上面的代码是利用数组的下标给数组循环赋值和输出,结果是
在这里插入图片描述
那么我们利用指针一样可以获得相同的结果,下面利用指针对数组进行赋值和输出
void main()
{
int a [10]; int *b;
b = a;
for (int i = 0; i < 10; i++)
{
*(b + i) = i;
}
for (int i = 0; i < 10; i++)
{
cout << *(b + i) << " " ;
}
cout << “\n”;
}
输出结果也是和上面一样,没有什么区别。
在这里插入图片描述

为什么指针也可以呢?那是因为数组是一片连续的内存对吧,那么既然是一片连续的内存,那么它们的地址肯定也是连续的,因为a数组是有十个元素的,而数组的索引是从零开始的,a 等于是a数组的第一个内存,a就是a[0]的地址,所以指针可以遍历数组的所有元素,也就可以对数组元素的值进行改变和输出。所有地址就是给指针来操作的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值