主要是根据C++ Primer学习后作的笔记,所以选择采用C++ primer的目录整理知识点
一、基本概念
指针用于指向单个对象,他记录的是对象的地址,而不是对象的本身或副本。指针有其个人的存储地址,这和对象地址,即指针内容是不一样的。
C++使用解引用操作符* (dereference operator)符把一个标识符声明为指针,每个指针都有一个与之关联的数据类型,该数据类型决定了指针所指向的对象的类型。
给出以下小程序作例子解释
#include <iostream>
#include <string>
using namespace std;
int main(){
string s("hello world");
string *sp = &s;
cout << s << endl;
cout << &s << endl << endl;
cout << *sp << endl;
cout << sp << endl << endl;
cout << &sp << endl;
}
以下是输出结果:
该小程序中,
string *sp = &s;
定义了一个标识符为 sp的 string对象指针,&s中的&符号是取地址(address-of)操作符,当此造作符用于一个对象上时,返回的是该对象的存储地址。所以这里sp赋值为s的地址。
留意这几句
cout << s << endl;
cout << &s << endl << endl;
cout << *sp << endl;
cout << sp << endl << endl;
前两句分别输出的是s对象内容,s的地址
而后面两句,*sp 输出的是 s的对象内容, 而sp输出的是s的地址
可以这么理解这句话,
string *sp = &s;
它定义了一个标识符为 *sp 的string对象,符号*说明sp是个指针,它记录的是s的地址。所以
cout << *sp << endl;
输出的是一个string内容,因为符号*是一个解引用操作符,对指针sp进行解引用操作,可获得该指针所指对象的值。
另外留意对比
cout << sp << endl << endl;
cout << &sp << endl;
的结果。两个语句输出的都是存储地址,但两者地址不一样。前者输出的是string对象s的存储地址,后者是输出string指针 sp的存储地址。