目录
一 指针
指针是一个变量,其值为另一个变量的内存位置的直接地址。在使用指针存储其他变量地址之前,需要指针进行行声明。
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。
指针使用实例代码:
#include <iostream>
int main() {
//定义一个变量
int a = 199;
//使用取地址符 & 获取变量的地址,并输出变量的地址
std::cout << "a 的地址为:" << &a << std::endl;
//定义一个指针变量p,指向变量a的地址
/* 用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,
都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。*/
int *pInt=&a;
//输出指针变量存储的地址
std::cout<<"指针p存储的地址是:"<<pInt<<std::endl;
//获取指针变量指向的地址的值
std::cout<<"指针pint指针指向的地址的值为:"<<*pInt<<std::endl;
return 0;
}
与指针相关的几个重要概念:
概念 | 描述 |
C++ 支持空指针。NULL 指针是一个定义在标准库中的值为零的常量。 | |
可以对指针进行四种算术运算:++、--、+、- | |
指针和数组之间有着密切的关系。 | |
可以定义用来存储指针的数组。 | |
C++ 允许指向指针的指针。 | |
通过引用或地址传递参数,使传递的参数在调用函数中被改变。 | |
C++ 允许函数返回指针到局部变量、静态变量和动态内存分配。 |
实例代码演示:
#include <iostream>
const int length=10;
int main() {
//如果一个指针没有指向任何地址,那么建议把该指针赋予一个NULL值或nullptr值,NULL或nullptr指向常量数字0
int *p= nullptr;
//这样,当判断该指针是否初始化完成时,就可以用if判断了
if (p== nullptr) std::cout<<"p是null"<<std::endl;
else std::cout<<"p不是null"<<std::endl;
std::cout<<"null等于:"<<p<<std::endl;
//对指针进行四种算术运算:++、--、+、- ,为了便于演示,我们先申明一个数组来配合指针使用
int array[length]={22,33,55,12,32,15,56,77,89,90};
int *p2=array;
//使用指针自增符号
for (int i = 0; i < length; ++i) {
std::cout<<"第"<<i+1<<"个元素的值为:"<< *p2 <<std::endl;
//每一次循环使指针p2自增1,int型的指针自增1相当于把指针指向的位置向下移动四个字节;
p2++;
}
//首先把指针指向数组的最后一个元素的地址
p2=&array[length-1];
//使用指针自减符号
for (int i =length-1; i >=0; i--) {
std::cout<<"第"<<i+1<<"个元素的值为:"<< *p2 <<std::endl;
//每一次循环使指针p2自增1,int型的指针自增1相当于把指针指向的位置向下移动四个字节;
p2--;
}
p2=array;
//指针使用+号
std::cout<<"p2+2后指向的地址的值为:"<< *(p2+2)<<std::endl;
p2=&array[length-1];
//指针使用+号
std::cout<<"p2-2后指向的地址的值为:"<< *(p2-2)<<std::endl;
//直接使用指针进行比较: 如果当前的指针的地址与数组的第三个元素相等,那么就输出相等,否则不相等。
if (p2==&array[7]) std::cout<<"p2==&array[2]结果是相等的"<<std::endl;
else std::cout<<"p2==&array[2]结果是不相等的"<<std::endl;
//指针数组: 就是数组的元素也是指针
int *pointers[length]; //申明指针数组,拥有length个指针元素
//使用int类型值给指针赋值
for (int i = 0; i < length; ++i) {
pointers[i]=&array[i];
}
//从数组指针里面取值
std::cout<<"指针数组pointers[2]第二个元素的值为:"<<*pointers[1]<<std::endl;
//可以用一个指向字符的指针数组来存储一个字符串列表,不过必须要用常量修饰符const修饰
const char *list[2]={"hello","world"};
//变量字符数组
for (int i = 0; i < 2; ++i) {
std::cout<<list[i]<<std::endl;
}
//指向指针的指针: 指针本身指向了另外一个指针的地址(指针本身也是需要内存来存储的其地址的),指向指针的指针类似与链条一样,层层链接
int core=10009;
int *pp;
pp=&core; //给指针赋值
int **ppp=&pp; //把pp指针的指针赋给二级指针ppp,二级指针申明时需要用两个 **号
//取得二级指针的值,也是需要带两个 ** 号
std::cout<<"**ppp的值为:"<<**ppp<<std::endl;
return 0;
}
二 引用
引用与指针的不同:
不存在空引用。引用必须连接到一块合法的内存。
一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
引用必须在创建时被初始化。指针可以在任何时间被初始化。
实例代码:
//申明一个以引用为返回值和参数的函数
int &count(int& a,int& b);
//实现定义
int &count(int& a,int& b){
//因为局部变量的作用域只在当前函数内,所有这里的sum需要申明为静态的,需要出了该方法之后依然有效
static int sum=a+b;
return sum;
}
int main() {
//把引用作为函数参数和参数返回值使用
int sum= count(core,core);
std::cout<<"使用引用函数返回的引用,其值为:"<<sum<<std::endl;
}
代码clone地址: git@gitcode.net:XiaoWang_csdn/cpp_7_pointerandquote.git