目录
4.1 指针定义
4.1.1 基本介绍
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。
就像其他变量或常量一样,我们必须在使用指针存储其他变量地址之前,对其进行声明。
指针变量声明的一般形式为:type *var-name;
type 是指针的基类型,它必须是一个有效的 C++ 数据类型,
var-name 是指针变量的名称。
用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。
有效的指针声明示例:
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
#include <iostream>
using namespace std;
int main()
{
int yar1;
char var2[10]; # 字符串数组var2,里面包含了十个元素
cout << "var1 变量的地址: ";
cout << &var1 << end1; # &运算符打印输出这两个变量的地址
cout << "var2 变量的地址: ";
cout << &var2 << end1; # 第一个或第0个元素的地址
return 0;
}
# 输出结果如下
var1 变量的地址:0xbfebd5c0
var2 变量的地址:0xbfebd5b6
使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。下面的实例涉及到了这些操作:
#include <iostream>
using namespace std;
int main()
{
int var = 20; // 实际变量的声明
int *ip; // 指针变量的声明
ip = &var; // *ip指向var的地址,在指针变量中存储var的地址
cout << "Value of var variable:"}
cout << var << end1;
// 输出在指针变量中存储的地址
cout << ''Address stored in ip variable:";
cout << ip << end1;
// 访问指针中地址的值
cout << "Value of *ip variable:";
cout << *ip << end1;
return 0;
}
# 输出结果
Value of var variable:10
Address stored in ip variable:0xbfc601ac
Value of *ip variable:20
指针变量和普通变量的区别:
• 普通变量存放的是数据,指针变量存放的是地址• 指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用总结1: 我们可以通过 & 符号 获取变量的地址
总结2:利用指针可以记录地址
总结3:对指针变量解引用,可以操作指针指向的内存
4.1.2 const修饰指针
const修饰指针有三种情况
int main(){
int a = 10;
int b = 10;
//const修饰的是指针,指针指向可以改,指针指向的值不可以改
const int * p1 = &a;
p1 = &b; //√
*p1 = 100; //x
//const修饰的是常量,指针指向不可以改,指针指向的值可以改
int * const p2 = &a;
p2 = &b; //x
*p2 = 100; //√
//const既修饰指针也修饰常量,都不能改
const int * const p3 = &a;
p3 = &b; //x
*p3 = 100; //x
system('pause');
return 0;
}
技巧:看const右侧紧跟着的是指针还是常量,
是指针就是常量指针,指向可以改,指向的值不能改
是常量就是指针常量,指向的值可以改,指向不能改
既修饰指针又修饰常量,都不能改
4.1.3 指针自增运算
指针是一个用数值表示的地址。我们可以对指针执行算术运算。
假设 ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算:
ptr++
执行 ptr++ 后,指针 ptr 会向前移动 4 个字节,指向下一个整型元素的地址。这是由于指针算术运算会根据指针的类型和大小来决定移动的距离。在这种情况下,由于是一个 32 位整数指针,每个整数占据 4 个字节,因此 ptr++ 会将指针 ptr 向前移动 4 个字节,指向下一个整型元素的地址。
如果 ptr 指向一个地址为 1000 的字符,执行 ptr++ 指针 ptr 的值会增加,指向下一个字符元素的地址,由于 ptr 是一个字符指针,每个字符占据 1 个字节,因此 ptr++ 会将 ptr 的值增加 1,执行后 ptr 指向地址 1001。