指针的初步学习
第一次用markdown编辑器,感觉很过瘾:-D
指针的初步学习
C++primer中指针的定义:
指针(pointer)是“指向(point to)”另外一种类型的复合类型。与引用类似,指针也实现了对其他对象的间接访问。
1.指针本身就是一个对象 2.指针无需在定义时赋初值
定义指针
int *p; //指向int型对象的指针
double *p1; //指向double型对象的指针
获取对象的地址
int ival = 42;
int *p = &ival // 指针p中存放ival对象的地址
指针值
指针的值(即地址)应属下列4中状态之一:
1.指向一个对象
2.指向紧邻对象所占空间的下一个位置
3.空指针,意味着指针没有指向任何对象
4.无效指针,也就是上述情况之外的其他值
利用指针访问并操作对象
int ival = 42;
int *p = &ival;
cout << *p //使用解引用符访问对象,输出ival的值,也就是42
*p = 0;
cout << *p //改变了p所指对象的值,输出为0
关于指针的指针辨析
指针的指针的内存空间中是所指指针的地址,所以对指针的指针第一次解引用后的值是所指指针指向的对象的地址,两次解引用后就是所指对象的值
#include<iostream>
using namespace std;
int main()
{
int ival = 42;
int *p = &ival; //p存放变量ival的地址,p是指向int型对象的指针
int **p1 = &p;//p1指向一个指向int型对象的指针的指针,即指针的指针
cout << p << endl;//输出的是变量ival的地址
cout << *p << endl;//使用*解引用符,此时输出的是42
cout << &p << "=" << p1 << endl;//指针p的地址
cout << *p1 << endl;//一次解引用,输出的为指针p的值,也就是ival变量的地址
cout << **p1 << endl;// 两次解引用,输出的为ival对应的值42
**p1 = 62;
cout << "ival:" << ival << endl;
cout << p << endl;//地址不变,但是地址对应的值改变了
return 0;
}
虽然不准确,但这样看起来更加直观
为一个对象创建多个指针
#include<iostream>
using namespace std;
int main()
{
int i = 42;
int *p1 = &i;
int *p2 = p1;//p1p2中所存的都是变量i的地址, p1和p2指向同一个对象
int *p3 = 0;
cout << "指针p1的地址:" << &p1 << endl;
cout << "指针p2的地址:" << &p2 << endl;
cout << "指针p3的地址:" << &p3 << endl;
cout << "指针p3的内容:" << p3 << endl;
cout << p1 << "=" << p2 << endl;
cout << *p1 << "=" << *p2 << endl;
//两个指针的地址并不一样,但他们内存空间中的内容,也就是指向对象的地址是一样的
p3 = &i;
cout << "指针p3的地址:" << &p3 << endl;//在已初始化指针的情况下,改变了指针所指对象后,指针的地址并没有改变
cout << "指针p3的内容:" << p3 << endl;//改变的只是指针内存空间的内容
}
关于指针的修饰符
类型修饰符(*或&)并不作用于本次定义的的全局变量
int *p, p1, p2;//p1是指向int型变量的指针,而p2、p3是int型变量
修饰符靠近类型名这种写法往往只用于定义一个变量,强调它的类型
int* p1; //创建了一个指向int型对象的指针
double* p2;//创建了一个指向int型对象的指针