程序经过编译之后,已经将变量名转换为变量的地址
将地址形象化地成为“指针”,通过它能访问以它为地址的内存单元。
一个变量的地址称为该变量的指针 --> 指针 = 地址
专门存放地址的变量称为指针变量 --> 指针变量 != 指针
在变量名之前加一个'*'表示该变量为指针变量
1.定义指针变量,必须要指定其类型;且其类型必须指向的是跟其同一类型的变量
2.不能将一个整数赋值给一个指针变量
#include <iostream>
using namespace std;
int main()
{
int a = 100, b = 10;
int *pointer_1 = &a, *pointer_2 = &b;
cout << a << " " << b << endl; // 100 10
cout << *pointer_1 << " " << *pointer_2 << endl; // 100 10
return 0;
}
若已经定义了pointer_1 = &a;
1.&*pointer_1 --> 由于&和*的优先级相同,因此从右向左结合
先执行*pointer_1 --> a
再执行&运算 --> &a
2.*&pointer_1 --> pointer_1 --> &a
#include <iostream>
using namespace std;
void swap(int *p1, int *p2)
{
int temp = *p1; // 向temp赋予的是p1的地址所存储的值
// 向普通变量只能赋常数值,不能赋地址!
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a,b; cin >> a >> b;
int *pointer_1 = &a, *pointer_2 = &b; // pointer_1指向a
// pointer_2指向b
if(a > b)
{
// 如果a > b,就使得*pointer_1和*pointer_2交换
swap(pointer_1, pointer_2); // 传递的是指针(地址)
}
cout << "min = " << a << " max = " << b << endl;
return 0;
}
【注】传参传的是指针(地址),函数内交换的是值!
数组名代表数组中第一个元素的地址
int *p = &a[0]; 等价于 int *p = a;
如果指针变量p已经指向数组中的一个元素,则p + 1指向同一数组中的下一个元素
p + i 等价于 a[i]
*(p + i)是p + i所指向的数组元素a[i]
即:*(a + i) == *(p + i) == a[i]
数组名代表数组首元素的地址;用数组名作函数的参数,传递的是数组首元素的地址
因此,用指针变量作函数形参,一样可以接收从实参传递来的数组首元素的地址
形参数组名在C++编译系统中,一律作为指针变量处理!
如:
main函数:select_sort(a,10);
select_sort函数:void select_sort(int *p, int n) // 用*p接收数组a首元素的地址
#include <iostream>
using namespace std;
int main()
{
char *str = "I love China!"; // 将字符串中第1个字符的地址赋给字符指针变量str
cout << str << endl;
return 0;
}
将字符串str1赋值给字符串str2
#include <iostream>
using namespace std;
int main()
{
char str1[] = "I love China!", str2[20];
char *p1 = str1, *p2 = str2;
for(; *p1 != '\0'; p1++,p2++)
{
*p2 = *p1;
}
cout << str1 << endl;
cout << str2 << endl;
return 0;
}
指向函数的指针:指针变量可以指向一个函数
指向函数的指针变量的定义格式为:
函数类型(*变量名)(函数形参表);
如:int(*p)(int x, int y); // 定义指向函数的指针变量p
返回指针值的函数:简称为指针函数,可以带回指针型的数据,即地址
定义格式:类型名 *函数名(参数表列);
如:int *a(int x, int y);
指针数组:本质是一个数组;数组中元素均为指针类型的数据(每一个元素都相当于一个指针变量)
定义格式:类型名 *数组名[数组长度];
如:int *p[4];
数组指针:本质是一个指针;指向一维数组的指针变量
定义格式:类型名(*数组名)[数组长度];
如:int(*p)[4];
int **p; // p是一个指针变量;*p是一个变量的值;**p是一个指向整型数据的指针变量