【C++】指针

*加入JS神教吧,一个没有指针的世界! *

菜鸡传送门

学习 C++ 的指针既简单又有趣。 (真的简单吗?) 通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的。

正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:

cpp 复制代码
#include <iostream>
 
using namespace std;
 
int main ()
{
   int  var1;
   char var2[10];
 
   cout << "var1 变量的地址: ";
   cout << &var1 << endl;
 
   cout << "var2 变量的地址: ";
   cout << &var2 << endl;
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

复制代码
var1 变量的地址: 0xbfebd5c0
var2 变量的地址: 0xbfebd5b6

什么是指针?

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。

以下是一些有效的指针声明案例:

cpp 复制代码
int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;    /* 一个字符型的指针 */

所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。
不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

C++ 中使用指针

使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。下面的实例涉及到了这些操作:

cpp 复制代码
#include <iostream>
 
using namespace std;
 
int main ()
{
   int  var = 20;   // 实际变量的声明
   int  *ip;        // 指针变量的声明
 
   ip = &var;       // 在指针变量中存储 var 的地址
 
   cout << "Value of var variable: ";
   cout << var << endl;
 
   // 输出在指针变量中存储的地址
   cout << "Address stored in ip variable: ";
   cout << ip << endl;
 
   // 访问指针中地址的值
   cout << "Value of *ip variable: ";
   cout << *ip << endl;
 
   return 0;
}

运行结果

复制代码
Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20

假如我们给一个指针赋予一个新的值会如何?

cpp 复制代码
#include <iostream>
 
using namespace std;
 
int main ()
{
   int  var = 20;    // 第一个实际变量
   int  another_var = 30;  // 第二个实际变量
   int  *ip;         // 指针变量的声明
 
   ip = &var;        // 指针指向var的地址
 
   cout << "Value of var variable: ";
   cout << var << endl;
 
   cout << "Value of another_var variable: ";
   cout << another_var << endl;
 
   // 输出指针当前存储的地址
   cout << "\nAddress stored in ip variable (指向var): ";
   cout << ip << endl;
 
   // 访问指针指向地址的值
   cout << "Value of *ip variable: ";
   cout << *ip << endl;
 
   // 给指针赋予新值(指向另一个变量)
   ip = &another_var;
 
   // 输出指针现在存储的新地址
   cout << "\nAddress stored in ip variable (指向another_var): ";
   cout << ip << endl;
 
   // 现在访问的是新地址的值
   cout << "Value of *ip variable now: ";
   cout << *ip << endl;
 
   return 0;
}

此时的运行结果:

可以发现ip已经代表另外一个变量的地址了。

如果我们试图给指针赋值呢?我的意思是直接赋值,类似我们a=10这样(别告诉我你没这么干过)

运行一下就会发现它报错了!

反过来想,当我们看见这样的报错时,说明我们错误地使用了指针。

使用指针赋值

如果我们使用指针去赋值呢?

cpp 复制代码
   *ip=10;
   // 输出指针现在存储的新地址
   cout << "\nAddress stored in ip variable(2) (指向another_var): ";
   cout << ip << endl;
 
   // 现在访问的是新地址的值
   cout << "Value of *ip variable now(2): ";
   cout << *ip << "; another_var=" << another_var << endl;

运行结果:

相关推荐
shark_dev2 分钟前
C++新特性——正则表达式
c++
云知谷8 分钟前
【经典书籍】C++ Primer 第16章模板与泛型编程精华讲解
c语言·开发语言·c++·软件工程·团队开发
屁股割了还要学15 分钟前
【Linux入门】常用工具:yum、vim
linux·运维·服务器·c语言·c++·学习·考研
仰泳的熊猫16 分钟前
LeetCode:51. N 皇后
数据结构·c++·算法·leetcode
workflower32 分钟前
基本作业-管理⾃⼰的源代码
开发语言·单元测试·软件工程·需求分析·个人开发
froginwe1141 分钟前
Pandas DataFrame:深入理解数据分析的利器
开发语言
Jm_洋洋44 分钟前
【Linux系统编程】程序替换:execve(execl、execlp、execle、execv、execvp、execvpe)
linux·运维·c语言·开发语言·程序人生
冯诺依曼的锦鲤1 小时前
算法练习:前缀和专题
开发语言·c++·算法
闭着眼睛学算法1 小时前
【双机位A卷】华为OD笔试之【哈希表】双机位A-跳房子I【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
java·c语言·c++·python·算法·华为od·散列表
JinSoooo1 小时前
pnpm monorepo 联调:告别 --global 参数
开发语言·javascript·ecmascript·pnpm