1指针的大小
指针的大小为4个字节,能够寻址的最大空间为4GB,指针的一般存在再内存中的栈区,其存放的值是某一个对象的地址,这个对象可能是C++语言中一个普通的数据类型,也有可能是一个结构体或者类对象。
2指针的分类
指针可以分为普通指针,常量指针,普通指针的指向可以更改,指向内存的空间的数据内容也可以更改。常量指针是指该指针指向的值为常量,不可以更改,但是该指针的指向可以更改。
指针常量固定的是指针到指向对象的映射已经固定,相当于建立了一个指针指向对象的固定通路,其指向不可以更改,所指的内容可以更改
int a, b = 10;
const int * p = &a;
//*p = 20; 该操作是违法的
p = &b;
//下面是一个指针常量
int * const p2 = &a;
//p =&b; 该操作是违法的
*p2 = 20;
我们通过举一反三可以知道,如果有两个const关键字修饰的呢,这样也是可以的哦
const int * const p = new int;
这样指针的指向是固定的,指针指向的内容也是不可以修改的哦,要特别注意
3空指针
空指针常常用于指针初始化,刚开始你现在是找不到一块内存空间来让指针指的话,那你就让他指向内存区的首地址,也就是编号为0的地址咯,由于在内存模型中,前面一段的内容是被系统把保留的部分,是不可以用来读写的哦。这里放一个内存分区模型来协助记忆
需要注意的一点是,如果是空指针的话,是不需要被释放的哟,所有在黑马的课程中,在进行内存的释放之前,往往先会对指针进行非空判断的:
if(p!=Null)
{
delete p;
p = Null;
}
野指针
野指针野指针,说明这个指针也有有蛮野的啦,当程序员创建一个指针,并将它随便指向一个未被分配的地址的话,时会出现系统错误的,比如:
int * p;
p = (int *)0x1100
//是会出现问题的啦
数组与指针
一维度数组的数组名称可以看成是指针,但是两者并不是等价的。由于在C++中数组的特殊性质:不能用另一个数组初始化,不能被直接拷贝,所以用数组作为输入参数的时候,实际上传进去的是数组的首地址;
void mysort(int Arr[])
{
cout <<Arr[3] << endl;
int L = sizeof(Arr) ;
cout <<sizeof(Arr)<< endl;
int temp = 0;
}
void main()
{
//
int a[] = { 3,5,6,1,6,2,4 };
cout << "来看一看数组名称a的内容是什么" << *a << endl;
cout << "来看看数组a的第一个元素的地址是啥"<<&a[0]<< endl;
//这样我们有理由相信 a = &a[0]了吗,实际上是不等价的
cout << "a的大小为" << sizeof(a)<<"&a[0]的大小为:"<<sizeof(&a[0])<<endl;
//根据这个我们可以知道,数组名称实际上就是数组的首地址
cout <<*a << endl;
cout << "a的大小为"<<sizeof(a)<< endl;
cout << sizeof(a)/sizeof(int)<< endl;
mysort(a);
system("pause");
int a[] = { 1,2,3,4,5 };
int *p = a; //错误信息会提示,应该使用{.....}来初始化聚合对象
cout << sizeof(a)<<" "<<sizeof(p)<< endl;
system("pause");
}
输出的结果为:
来看一看数组名称a的内容是什么3
来看看数组a的第一个元素的地址是啥008FFDA8
a的大小为28&a[0]的大小为:4
3
a的大小为28
7
1
4
请按任意键继续. . .