要注意!
指针是有类型的!
给指针赋值,不但必须是一个地址,而且应该是一个与指针类型相符的变量或常量的地址。
众所周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
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
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;//初始化
引用定义时必须初始化,这是引用与指针的不同,给引用的初始化的总是一个内存实体。
引用值是引自所指向的实体。