第十四天学习精要
指针的基本概念和用法
指针的基本概念
-
每个变量都被存放在从某个内存地址(以字节为单位)开始的若干个字节中。
-
指针也称作指针变量,大小为4个字节(或8个字节)的变量,其内容代表一个内存地址。
-
通过指针,能够对该指针指向的内存区域进行读写。
指针的定义和内容
-
类型名 * 指针变量名;
- int * p;
- p 是一个指针,变量 p的类型是 int *。
- char * pc;
- pc 是一个指针, 变量 pc 的类型是 char *。
- float *pf;
- pf 是一个指针,变量 pf 的类型是 float *。
- int * p;
-
int * p = ( int * ) 40000;
- p指向地址40000,地址p就是地址40000。
- *p 就代表地址40000开始处的若干个字节的内容。
-
通过指针访问其指向的内存空间
int * p = ( int * ) 40000;
// 往地址40000处起始的若干个字节的内存空间里写入 5000
*p = 5000;
// 将地址40000处起始的若干字节的内容赋值给 n
int n = *p; // “若干” = sizeof(int),因为 int * p;
指针定义总结
- T * p ;
- T 可以是任何类型的名字,比如 int,double,char 等等。
- p 的类型:T *。
- *p 的类型: T。
- 通过表达式 * p,可以读写从地址p开始的 sizeof(T)个字节。
- *p 等价于存放在地址p处的一个 T 类型的变量。
- * :间接引用运算符。
- sizeof(T*) :4字节(64位计算机上可能8字节)。
指针用法
-
& : 取地址运算符。
-
&x : 变量x的地址(即指向x的指针)。
-
对于类型为 T 的变量 x,&x 表示变量 x 的地址(即指向x的指针)。
-
&x 的类型是 T *。
# include <iostream>
# include <cstring>
using namespace std;
int main()
{
char ch1 = 'A';
char *p1 = &ch1; // 使得p1指向变量ch1
*p1 = 'B'; // 使得ch1 = 'B'
cout << ch1 << endl;
char ch2 = *p1; // 使得ch2 = ch1
p1 = &ch2; // 使得pc 指向变量ch2
*p1 = 'D'; // 使得ch2 = 'D'
cout << ch2 << endl;
return 0;
}
指针的意义和互相赋值
指针的作用
-
有了指针,就有了自由访问内存空间的手段。
扫描二维码关注公众号,回复: 3667536 查看本文章 -
不需要通过变量,就能对内存直接进行操作。
-
通过指针,程序能访问的内存区域就不仅限于变量所占据的数据区域。
-
在C++中,用指针p指向a的地址,然后对p进行加减操作,p就能指向a后面或前面的内存区域,通过p也就能访问这些内存区域。
指针的互相赋值
- 不同类型的指针,如果不经过强制类型转换,不能直接互相赋值。
指针的运算
指针的运算
-
两个同类型的指针变量,可以比较大小:
- 地址p1<地址p2: p1< p2 值为真。
- 地址p1=地址p2:p1== p2 值为真。
- 地址p1>地址p2:p1 > p2 值为真。
-
两个同类型的指针变量,可以相减:
- 两个T * 类型的指针 p1和p2。
- p1 – p2 = ( 地址p1 – 地址 p2 ) / sizeof(T)。
-
指针变量加减一个整数的结果是指针:
- p : T * 类型的指针。
- n : 整数类型的变量或常量。
- p+n : T * 类型的指针,指向地址:地址p + n × sizeof(T)。
-
指针变量可以自增、自减:
- T* 类型的指针p指向地址n。
- p++,++p:p指向 n + sizeof(T)。
- p–,--p :p指向 n - sizeof(T)。
-
指针可以用下标运算符“[ ]”进行运算:
- p 是一个 T * 类型的指针,
- n 是整数类型的变量或常量
- p[n] 等价于 *(p+n)。
# include <iostream>
# include <cstring>
using namespace std;
int main()
{
int *p1, *p2;
int n = 4;
char *pc1, *pc2;
p1 = (int *)100; // 地址p1为100
p2 = (int *)200; // 地址p2为200
// 输出 1) 25, 因(200-100)/sizeof(int) = 100/25 = 4
cout<< "1) " << p2 - p1 << endl;
pc1 = (char *)p1; // 地址pc1为100
pc2 = (char *)p2; // 地址pc2为200
// 输出 2) -100,因为(100-200)/sizeof(char) = -100
cout << "2) " << pc2 - pc1 << endl;
cout << "3) " << (p2 + n) - p1 << endl; // 输出 3) 29
int * p3 = p2 + n; // p2 + n 是一个指针,可以用它给 p3赋值
cout << "4) " << p3 - p1 << endl; // 输出 4) 29
cout << "5) " << (pc2 - 10) - pc1 << endl; // 输出 5) 90
return 0;
}