【C/C++ 学习笔记】指针
视频地址: Bilibili
概念
- 可以通过指针间接访问内存
- 用于保存地址
使用
通过 & 可以获取数据的指针
通过 * 可以取得指针的数据
指针的数据类型就是 数据类型 *
c++
int number = 10;
int *p = &number;
// 10
cout << "number: " << number << endl;
// 000000149F0FF960
cout << "p: " << p << endl;
// 10
cout << "p's number : " << *p << endl;
内存
32 位占 4 个字节,64 位占 8 个字节
空指针
指针变量指向内存中编号为 0 的空间
- 用于初始化指针变量
- 空指针的内存数据无法访问
c++
int *p = NULL;
// ERROR!
// &p = 100;
野指针
指针变量指向非法的内存空间,无法确定是否能够使用
c++
// ERROR
int *p = (int *)0x1100;
const 修饰指针
-
const 修饰指针 -> 常量指针
-
指针的指向可以修改,但是指针指向的值不能修改
c++// const 修饰指针 int a1 = 10; int b1 = 10; const int *p1 = &a1; // ERROR // *p1 = 20; // PASS p1 = &b1;
-
-
const 修饰常量 -> 指针常量
-
指针的指向不可以修改,但是指针指向的值可以修改
c++// const 指针常量 int a2 = 10; int b2 = 10; int *const p2 = &a2; // PASS *p2 = 20; // ERROR // p2 = &b2;
-
-
const 修饰指针&常量
-
指针的指向不可以修改,并且指针指向的值也不可以修改
c++const int *const p3 = &a3;
-
指针和数组
数组名就是指向数组的首地址
c++
int arr[] = {1, 2, 3, 4, 5};
int *p3 = arr;
cout << "p3: " << *p3 << " arr[0]: " << arr[0] << endl;
// p + 1 导致指针向后移动 4 个字节
cout << "p3: " << *(p3 + 1) << " arr[0]: " << arr[1] << endl;
指针和函数
通过指针传参可以修改原数据
c++
int add1(int a, int b) {
a++;
b++;
return a + b;
}
int add2(int *a, int *b) {
*a = *a + 1;
*b = *b + 1;
return *a + *b;
}
c++
int a = 10;
int b = 20;
// 不修改原值
cout << "add1: " << add1(a, b) << endl;
// 10 20
cout << "a: " << a << " b: " << b << endl;
// 修改原值
// 32
cout << "add2: " << add2(&a, &b) << endl;
// 11 21
cout << "a: " << a << " b: " << b << endl;
冒泡排序:
c++
void bubble(int *arr, int len) {
for (int i = 0; i < len; i++) {
for (int j = 0; j < len - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
*(arr + j) = arr[j + 1];
*(arr + j + 1) = temp;
}
}
}
}