C++指针(坚持更新c++内容的第1天)

概述

c/c++语言强大,效率高。很大的程度是体现在指针的灵活运用上面。即便是有经验的程序员使用指针也会因指针的错误而受折磨。本文参考各位大佬的资料来记录一下有关于指针的概念以及相关用法。

1. 什么是指针?

复合类型(compound type)是指基于其他类型定义的类型。C++语言有几种复合类型,比如引用和指针。引用(reference)为对象起了另外一个名字,通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名,值得注意的是,引用必须被初始化,程序把引用和它的初始值绑定(bind)在一起。除此之外,由于引用本身不是一个对象, 所以不能定义引用的引用。程序加载到内存中后,在程序中使用的变量、常量、函数等数据,都有自己唯一的一个编号,这个编号就是这个数据的地址。指针的值实际是内存单元的编号,所以指针单从数值看,也是整数,一般用16进制表示。指针就是程序数据的地址,指针变量是存这些地址的变量。

2. 指针对象 (变量)

用来保存指针的对象,就是指针对象。如果指针变量p1保存了变量a的地址,则说p1指向变量a。指针值应属于4种状态之一: 1. 指向一个对象。 2. 指向紧邻对象所占空间的下一个位置。3. 空指针,意味着指针没有指向任何对象。4.无效指针。其中,第2种状态主要用于迭代器和指针的计算。第3种状态空指针,其不指向任何对象,通常让指针变量赋值为NULL表示一个空指针。C++11标准引入的一种方法,用nullptr来初始化指针。第4种状态无效指针,未经过初始化的指针是无效指针,所以定义指针变量的时候一定要进行初始化(未经过初始化的指针是运行错误的一大原因)。

2.1 定义指针对象

定义指针变量时,在变量名前写一个*星号, 这个变量就变成了对应变量类型的指针变量。必要时要加()来避免优先级的问题。

int *p;  //定义指向int类型变量的指针

double *p; //定义指向double类型变量的指针

Student *student; //定义指向类或者结构体的指针

int **p; //定义指向整型变量指针的指针

int (*p)[3]; //定义指向3个整型元素数组的指针

int (*p)(int, int) //定义指向返回类型为int,有2个int形参的函数的指针

2.2 获取对象地址

指针用于存放某个对象的地址,想要获取该地址,需要使用取地址(&)。

double val;
double *p = &val;

int val;
int *p = &val;

# 数组名的值就是这个数组的第一个元素的地址
int arr[2] = {1, 2};
int *p = arr;

# 函数名的值就是这个函数的地址
int add(int a, int b)
{
   return a+b;
}

int (*p)(int, int) = add;

# 字符串常量作为右值时,就是这个字符串对应的字符数组的名称
const char *p = "hello world"

2.3 解析地址对象

如果指针指向了一个对象,用操作符*来访问该对象。

int age = 19;
int *p = &age;
*p = 22; //通过指针修改指向的内存数据

对于结构体和类,使用->符号访问内部成员。

2.4 赋值和指针

 有时候,想要搞清楚赋值语句到底是改变了指针的值还是改变了指针所指对象的值都不是很容易,最好的办法就是记住赋值永远改变的是等号左侧的对象。

# p的值被改变, 现在p指向了val
int age = 10;
int val = 20;
int *p = &age;
p = &val;

# val的值被改变, 指针p没有变
*p = 120;

指针间的赋值,指针赋值和int变量赋值一样,将地址的值拷贝给另外一个。

# 指针之间的赋值是一种浅拷贝
int *p1 = &a;
int *p2 = p1;

参考资料
《C++ primer 第五版》

C++指针详解 - ggjucheng - 博客园

C++指针详解_YoungYangD的博客-CSDN博客_c++指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值