指针是一种变量类型,其值为另一个变量的地址,即内存位置的直接地址。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。在 64 位计算机中,指针占 8 个字节空间。使用指针时可以用以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。
C++
#include<iostream>
using namespace std;
int main(){
int *p = nullptr;
cout << sizeof(p) << endl; // 8
char *p1 = nullptr;
cout << sizeof(p1) << endl; // 8
return 0;
}
C 语言中定义了空指针为 NULL,实际是一个宏,它的值是 0,即 #define NULL 0。C++ 中使用 nullptr 表示空指针,它是 C++ 11 中的关键字,是一种特殊类型的字面值,可以被转换成任意其他类型。
两个同类型指针可以比较大小;
两个同类型指针可以相减;
指针变量可以和整数类型变量或常量相加;
指针变量可以减去一个整数类型变量或常量;
指针变量可以自增,自减;
C++
int a[10];
int *p1 = a + 1; // 指针常量相加
int *p2 = a + 4;
bool greater = p2 > p1; // 比较大小
int offset = p2 - a; // 相减
p2++; // 自增
p1--; // 自减
C++
#include <iostream>
using namespace std;
class A
{
};
int main()
{
A *p = new A();
return 0;
}
C++
#include <iostream>
using namespace std;
int main(void)
{
const int c_var = 10;
const int * p = &c_var;
cout << *p << endl;
return 0;
}
C++
#include <iostream>
using namespace std;
int add(int a, int b){
return a + b;
}
typedef int (*fun_p)(int, int);
int main(void)
{
fun_p fn = add;
cout << fn(1, 6) << endl;
return 0;
}
特别注意:定义指向成员函数的指针时,要标明指针所属的类。
C++
#include <iostream>
using namespace std;
class A
{
public:
int var1, var2;
static int x;
static int get() {
return 100;
}
int add(){
return var1 + var2;
}
};
int main()
{
A ex;
ex.var1 = 3;
ex.var2 = 4;
int *p = &ex.var1; // 指向对象成员变量的指针
cout << *p << endl;
int (A::*fun_p)();
int (*fun_q)();
fun_p = &A::add; // 指向对象非静态成员函数的指针 fun_p
fun_q = A::get; // 指向对象静态成员函数的指针 fun_q
cout << (ex.*fun_p)() << endl;
cout << (*fun_q)() << endl;
return 0;
}
而对于函数类型到函数指针类型的默认转换,只有当函数类型是左值的时候才行。所有对于非静态的成员函数,就不存在这种从函数类型到函数指针类型的默认转换,于是编译器也就不知道这个 p = A::add 该怎么确定。
C++
#include <iostream>
#include <cstring>
using namespace std;
class A
{
public:
void set_name(string tmp)
{
this->name = tmp;
}
void set_age(int tmp)
{
this->age = age;
}
void set_sex(int tmp)
{
this->sex = tmp;
}
void show()
{
cout << "Name: " << this->name << endl;
cout << "Age: " << this->age << endl;
cout << "Sex: " << this->sex << endl;
}
private:
string name;
int age;
int sex;
};
阅读量:2017
点赞量:0
收藏量:0