C++基础语法七-指针 part2


呃呃呃距离上一篇文章已经过去N个月了。。。大二了真的挺忙的就给鸽了现在继续更新!

一、指针的类型

要注意!
指针是有类型的!
给指针赋值,不但必须是一个地址,而且应该是一个与指针类型相符的变量或常量的地址。

二、强制类型转换:

众所周zi,所有的数据都是二进制,所以在C语言 C语言 C语言里,出现了强制类型转换的这个操作:

(float:啊啊啊啊啊int你你不要过来啊啊啊啊啊啊~
(int:嘿嘿嘿~
?????(不要发弹幕啊喂~

具体操作是这样的:

如果想把float转换成int:

int*p =int*)&f ;

这里面的 “(int*)” 的意思是说:它后面的任何数据,都将以整形地址看待,

哒噶! 但是啊,这导致这行代码极其不稳定。。。
所以还是少用为妙。

我们再来看看C++里面的强制类型转换

首先有一个问题:为什么会出现这个东西?
首先回答这个问题:为了满足指针和引用才搞出来的这个操作。

目的:
是为了逃避编译的类型检查,以使不是专门用来完成任务的模块能凑一起用。

int* ip = reinterpret_cast<int*>(&f);

emmmmm好复杂QAQ

所以。。。。能不用还是不用了吧。。。。

三、指针运算:

众所周zi,指针的值代表一个地址,因此它的内部表示为一个整数,在打印指针的时候能看到。指针变量所占用的空间大小总是等于整型变量的大小。 但是!!!他不是整形数。

问:什么是整形数?
答:三要素缺一不可:数据表示、范围表示、操作集合。

因为指针虽说前两个特点指针具备,但是它具有不同的操作。

例如:整形变量不能不能进行间接访问操作,指针不符合整形的操作法则,例如加减。

注意!
指针的加减大多用于连续的空间中,例如数组。

举起我们的栗子老哥:

#include<iostream>
using namespace std;
int main()
{
	int iarry[6];
	for (int i = 0; i < 6; ++i)
		iarry[i] = i * 2;
	for (int* ip = iarry; ip < iarry + 6; ip += 1)
		cout << ip << ":" << *ip << endl;
	return 0;
}

我问会得到如下结果:

006FFD18:0
006FFD1C:2
006FFD20:4
006FFD24:6
006FFD28:8
006FFD2C:10

解释一下哈,先给数组赋值为0,2,4,6,8,10;再移动指针做输出操作。

需要注意一下,作为指针的ip每次移动只加一而不是加4,单元素的地址却是以4递增的。

所以,
float: cxcx加6,实际增加了24字节
char:减7,实际减少了7个字节
double:加2,实际增加了16个字节

四、指针限定

众所周知,一个指针可以操作两个实体,一个是指针值,还有一个就是间接访问值。于是指针也能分为两种:指针常量常量指针

这里要说明一下,指针常量是相对于指针变量而言的指针的值,也就是地址且不可修改常量指针是指向常量的指针的简称。
要注意,这两个一个是指针的值,一个是指针。

所以,对于const来说,若const修饰的是指针本身,则为指针常量,若修饰的是指针类型,则为常量指针。

举几个例子:

1 const int a = 78;
2 int b=10 ;
3 int c =18;
4 const int* ip=&a;
5 int *const cp=&b;
6 int const *dp=&b;
7 const int* const icp=&c;
8 *ip=87;
9  ip=&c;
10 *cp=81;
11 cp=&b;
12 *icp=33;
13 icp=&b;
14  int d =*icp;

在上述代码中,
第四行:const修饰指向的实体类型为其后面的int* ip= &a;——常量指针;
第五行:const修饰的是cp——指针常量
第六行:const后面是指针*dp,跟上面的一样。
第七行就有点怪异了,结合前三句应该是额。。。常量指针常量?但是是对的。。。
第八行:错,因为常量指针不能修改所指向的实体,*IP只能做右值,也就是说,只能将其赋值给别的变量。
第九行:ok,常量指针可以修改指针的值。
第十行:ok,指针常量可以修改所指向的实体。
十一行:错,指针常量不能修改指针值,即使是同一个地址。
十二行:错,常量指针常量不呢鞥修改指向的实体。同样下一行,也不能修改指针值。

用这个来表示
图中红色的模块是不可修改的内容
图中红色的模块是不可次改的内容
但是要注意一点,const修饰只是限定指针的操作,但不能限定空间上实体的可改变性。因为一个实体可能不知被一个变量所关联,所以实体被其他变量关联的改变时可能的。
例如:

#include<iostream>
using namespace std;
int main()
{
	int a = 78, c = 18;
	const int* ip = &a;
	const int* const icp = &c;
	a = 60;
	c = 28;
	cout << "ip=>" << a << endl;
	cout << "icp=>" << c << endl;
}

这个小程序输出的就是60和28,因为我们限定的是指针,而不是a和c变量。

五、引用

引用定义如下:

int someint = 5;
int& rint = someint;//初始化

引用定义时必须初始化,这是引用与指针的不同,给引用的初始化的总是一个内存实体。

引用值是引自所指向的实体。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值