长安的花

当学问走过漫漫古道
凿刻入千窟,心也从愚昧中苏醒

0%

c++学习06-指针

内存

程序在硬盘上以文件的形式存在,但他们的运行却是在计算机的内存里发生的。

整形,浮点型 4 个字节,字符 1个 字节。

浮点型是从字节8处开始存储。

对齐

问题:浮点型变量C的值为什么从内存地址8处开始存储,而不是从内存地址5处存储。

其实在c++里,变量类型是根据他们的自然边界进行对齐,不过这个我们只需要知道即可,不需要太关心,因为编译器会帮我们处理这类的问题。

对齐问题会因为系统平台不同而不同。

寻址

  • 变量名索引
  • 另一种通过地址

这里引出一个新的操作符,取址操作符 & 这个叫 and。作用是获取变量的地址。

用法

1
2
int var = 123;
std::cout<<"Address is: " << &var;

32位对应 4位字节,64位对应8位字节。

地址

地址在程序执行期间不会发生变化。

不过同一个程序不同时间加载到内存中,同一个变量的地址是会改变的。

使用指针

  • 地址是计算机内存中的某个位置,指针是专门用来存放地址的特殊类型变量
  • 一般用这种形式type *pointerName; 来声明指针变量
  • int *p;
  • int pp = 123;
  • p = &pp;

思考

int *p1,p2,p3;

这里只表示 将p1申请为指针,p2,p3是整形

空格

空格放在哪里都是可以接受的。

1
2
3
int *p1;
int * p1;
int* p1;

指针变量前的类型,必须配对使用;

为什么要指针变量

  1. 直接访问硬件
  2. 快速访问数据
  3. 返回一个以上的值(返回数组或者结构体的指针)
  4. 表示复杂的数据结构
  5. 方便处理字符串

总结

  • 创建变量时,系统将分配一些内存块用来保存它们的值;
  • 每个内存块拥有一个独一无二的地址;
  • 变量的地址可以用 &variablename 语法来取得;(注:& 我们称为 ”取地址” 操作符)
  • 可以把地址赋值给一种称为指针的特殊变量;
  • 指针的类型必须与由它保存其地址的变量的类型一致。

利用指针改变值

1
2
3
4
int a = 456;
char b = ‘C’;
int *aPointer = &a;//阿斯科马
Char *bPointer = &b;

这会让程序保留4个内存块,两个为变量保留,两个为指针保留。变量a 和变量b 里边存放的是变量的值; 两个指针变量存放着指针的值,这些值是其他变量的地址

图解

指针只需要存放地址的第一个数就行,因为知道变量类型,变量类型有固定的字节个数,所以知道地址的第一个数,向后推就可以得到全部的地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>

int main()
{
int a = 123;
float b = 3.14;
char c = 'C';
unsigned long d = 19880808;
std::string e = "I love FishC!";

std::cout << " a 的值是: " << a << "\n";
std::cout << " b 的值是: " << b << "\n";
std::cout << " c 的值是: " << c << "\n";
std::cout << " d 的值是: " << d << "\n";
std::cout << " e 的值是: " << e << "\n\n";

int *aPointer = &a;
float *bPointer = &b;
char *cPointer = &c;
unsigned long *dPointer = &d;
std::string *ePointer = &e;

*aPointer = 456;
*bPointer = 4.13;
*cPointer = 'F';
*dPointer = 20111124;
*ePointer = "I love Beauty!";

std::cout << " a 的值是: " << a << "\n";
std::cout << " b 的值是: " << b << "\n";
std::cout << " c 的值是: " << c << "\n";
std::cout << " d 的值是: " << d << "\n";
std::cout << " e 的值是: " << e << "\n\n";

return 0;
}

*号的作用

  • 第一种用于创建指针
    int *myPointer = &myInt;
  • 第二种是对指针进行解引用
    *myPointer = 3998;
  • 乘号

指针群p

C++ 允许指针群 P,就是多个指针有同样的值

1
2
int *p1 = &myInt;
int *p2 = &myInt;

C++ 支持无类型(void)指针,就是没有被声明为某种特定类型的指针

1
void *vPointer

对一个无类型指针进行解引用前,必须先把它转换为一种适当的数据类型.

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道