• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

C++指针学习和记录

一直因为C++指针烧脑,所以一直可以逃避这c++,但时最近有空并且感觉学习很多C++有点绕不过去,所以抱着最少能看懂程序的要求来学习C++,基本知识跟别的语言大同小异,但是指针确实看的一知半解,所以记录一下提高自己,顺便帮助需要的人。

   指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:

type *var-name;

type 是指针的基类型,它必须是一个有效的 C++ 数据类型,var-name 是指针变量的名称,星号是用来指定一个变量是指针,通过 * 来返回位于操作数所指定地址的变量的值。使用连字号(&)运算符加上指针变量来访问内存地址。以下是有效的指针声明:

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

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

使用指针时操作步骤:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。

实例如下:

#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

指针运算:

指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。

假设 ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算:

ptr++

在执行完上述的运算之后,ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节。这个运算会在不影响内存位置中实际值的情况下,移动指针到下一个内存位置。如果 ptr 指向一个地址为 1000 的字符,上面的运算会导致指针指向位置 1001,因为下一个字符位置是在 1001。

我们喜欢在程序中使用指针代替数组,因为变量指针可以递增,而数组不能递增,因为数组是一个常量指针。下面的程序递增变量指针,以便顺序访问数组中的每一个元素:

实例如下:

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main ()
{
   int  var[MAX] = {10, 100, 200};
   int  *ptr;
 
   // 指针中的数组地址
   ptr = var;
   for (int i = 0; i < MAX; i++)
   {
      cout << "Address of var[" << i << "] = ";
      cout << ptr << endl;
 
      cout << "Value of var[" << i << "] = ";
      cout << *ptr << endl;
 
      // 移动到下一个位置
      ptr++;
   }
   return 0;
}

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

Address of var[0] = 0xbfa088b0
Value of var[0] = 10
Address of var[1] = 0xbfa088b4
Value of var[1] = 100
Address of var[2] = 0xbfa088b8
Value of var[2] = 200

递减指针如下:
#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main ()
{
   int  var[MAX] = {10, 100, 200};
   int  *ptr;
 
   // 指针中最后一个元素的地址
   ptr = &var[MAX-1];
   for (int i = MAX; i > 0; i--)
   {
      cout << "Address of var[" << i << "] = ";
      cout << ptr << endl;
 
      cout << "Value of var[" << i << "] = ";
      cout << *ptr << endl;
 
      // 移动到下一个位置
      ptr--;
   }
   return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:

Address of var[3] = 0xbfdb70f8
Value of var[3] = 200
Address of var[2] = 0xbfdb70f4
Value of var[2] = 100
Address of var[1] = 0xbfdb70f0
Value of var[1] = 10

指针数组:

指针和数组是密切相关的。事实上,指针和数组在很多情况下是可以互换的。例如,一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组

而指针数组,我们让数组存储指向 int 或 char 或其他数据类型的指针,声明如下:

int *ptr[MAX];

在这里,把 ptr 声明为一个数组,由 MAX 个整数指针组成。因此,ptr 中的每个元素,都是一个指向 int 值的指针。下面的实例用到了三个整数,它们将存储在一个指针数组中,如下所示

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main ()
{
   int  var[MAX] = {10, 100, 200};
   int *ptr[MAX];
 
   for (int i = 0; i < MAX; i++)
   {
      ptr[i] = &var[i]; // 赋值为整数的地址
   }
   for (int i = 0; i < MAX; i++)
   {
      cout << "Value of var[" << i << "] = ";
      cout << *ptr[i] << endl;
   }
   return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:

Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200

也可以用一个指向字符的指针数组来存储一个字符串列表,如下:

#include <iostream>
 
using namespace std;
const int MAX = 4;
 
int main ()
{
 const char *names[MAX] = {
                   "Zara Ali",
                   "Hina Ali",
                   "Nuha Ali",
                   "Sara Ali",
   };
 
   for (int i = 0; i < MAX; i++)
   {
      cout << "Value of names[" << i << "] = ";
      cout << names[i] << endl;
   }
   return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:

Value of names[0] = Zara Ali
Value of names[1] = Hina Ali
Value of names[2] = Nuha Ali
Value of names[3] = Sara Ali

觉得重要的知识点,暂时就总结到这些,倒数第二个实例不知道是不是有更好更简便的方法,还是最后一个实例中什么时候需要const (调试时发现没有const就会报错)。欢迎大家评论区留言和交流

全部回复(44)
正序查看
倒序查看
2021-12-20 12:28

语法跟C语言差不多,有空补习一下

0
回复
米修儿
LV.4
3
2021-12-22 08:52
@lihui710884923
语法跟C语言差不多,有空补习一下

是的,不过无论是C还是C++,指针是精髓,也是难点

0
回复
2021-12-22 14:59

指针真的是烧脑,看了很久还是不能完全掌握,只能项目中慢慢熟悉了

0
回复
2021-12-22 14:59

文章写的很通俗易懂,么事就过来温习一遍,先收藏了

0
回复
米修儿
LV.4
6
2021-12-23 09:19
@dy-q1PtffAR
指针真的是烧脑,看了很久还是不能完全掌握,只能项目中慢慢熟悉了

是的,指针一直是我想逃避的语法,没办法了才来学习,所以记录下来,随时过来复习

0
回复
2021-12-23 09:42

在程序中使用指针代替数组,因为变量指针可以递增,而数组不能递增,确实指针会方便点。

0
回复
2021-12-23 09:46

语法上跟C语言大同小异,不过新的标准更新了不少

0
回复
米修儿
LV.4
9
2021-12-23 09:47
@米修儿
是的,不过无论是C还是C++,指针是精髓,也是难点

是的,有C基础的话,学习起来就容易很多

0
回复
米修儿
LV.4
10
2021-12-23 09:48
@星球居民-sCcAfEGY
语法上跟C语言大同小异,不过新的标准更新了不少

嗯,新标准更人性化点

0
回复
2021-12-23 10:00

一些底层代码用C++运行效率确实提高不少,偶尔混合编程还是需要的

0
回复
dy-SLPHrVRz
LV.1
12
2021-12-23 15:29

看过C++一直没学好指针,文章写的通俗易懂,收藏了

0
回复
dy-SLPHrVRz
LV.1
13
2021-12-23 15:30

写的很详尽,遇到问题了过来一起讨论

0
回复
2021-12-23 15:50

烧脑的指针,不过文章讲的很直白,很是受用

0
回复
2021-12-23 15:56

指针很麻烦,但是熟练之后很少方便快捷,比数组要方便不少

0
回复
米修儿
LV.4
16
2021-12-23 16:02
@星球居民-6wBTmHfM
指针很麻烦,但是熟练之后很少方便快捷,比数组要方便不少

确实是,熟练了比数组用起来还要方便

0
回复
米修儿
LV.4
17
2021-12-23 16:03
@dy-SLPHrVRz
写的很详尽,遇到问题了过来一起讨论

欢迎有问题来评论,一起探讨学习

0
回复
米修儿
LV.4
18
2021-12-23 16:15
@星球居民-sCcAfEGY
一些底层代码用C++运行效率确实提高不少,偶尔混合编程还是需要的

C++胜在执行效率,学习起来还是C#快

0
回复
米修儿
LV.4
19
2021-12-23 16:18
@dy-q1PtffAR
指针真的是烧脑,看了很久还是不能完全掌握,只能项目中慢慢熟悉了

项目实践是最好的学习方式

0
回复
#回复内容已被删除#
20
#回复内容已被删除#
21
#回复内容已被删除#
22
#回复内容已被删除#
23
#回复内容已被删除#
24
dy-NCJU4yct
LV.1
25
2021-12-27 09:15

指针上大学的时候没学好,借着这个文章顺便温习回顾一下

0
回复
dy-NCJU4yct
LV.1
26
2021-12-27 09:16

听说指针很强大,但是一直学的半生不熟的,有空好好学习一下

0
回复
米修儿
LV.4
27
2021-12-27 10:41
@星球居民-sCcAfEGY
在程序中使用指针代替数组,因为变量指针可以递增,而数组不能递增,确实指针会方便点。

是的,所以很多高手更喜欢用指针而不用数组

0
回复
米修儿
LV.4
28
2021-12-27 14:19
@dy-NCJU4yct
指针上大学的时候没学好,借着这个文章顺便温习回顾一下

上大学的时候C都学过,可是都还给老师了,大学是最好的学习时间

0
回复
米修儿
LV.4
29
2021-12-27 14:20
@dy-NCJU4yct
听说指针很强大,但是一直学的半生不熟的,有空好好学习一下

学习c++的话指针是真的强大和方便

0
回复
2021-12-27 14:21

不错不错,温故而知新啊

0
回复
米修儿
LV.4
31
2021-12-27 14:21
@dy-NCJU4yct
指针上大学的时候没学好,借着这个文章顺便温习回顾一下

上学是最好的学习时间,但是上学的时候不懂得珍惜

0
回复