黑马培训的C/C++教程的笔记。
指针的定义和使用
#include<iostream>
using namespace std;
/**
* 指针的定义和使用
*/
int main() {
// 1、定义指针
int a = 0;
// 指针定义的语法 数据类型 * 指针变量名
int* p;
// 让指针记录变量a的地址
p = &a;
cout << "a的地址:" << &a << endl; // 004FFB00
cout << "p的地址:" << p << endl; // 004FFB00
// 2、使用指针
// 可以通过【解引用】的方式找到指针指向的内存中的值
cout << "*p:" << *p << endl; // 0
*p = 1000;
cout << "a === " << a << endl; // 1000
cout << "*p === " << *p << endl; // 1000
}
指针也是一种数据类型
指针和int、char等一样,也是一种数据类型。
- 开发环境一般是32位系统。指针占 4 个字节;64位系统占8字节。
#include<iostream>
using namespace std;
int main() {
int a = 0;
int* p = &a;
cout << "sizeof (int *) " << sizeof(int *) << endl; // 4
cout << "sizeof (float *) " << sizeof(float *) << endl; // 4
cout << "sizeof (double *) " << sizeof(double *) << endl; // 4
cout << "sizeof (char *) " << sizeof(char *) << endl; // 4
}
由代码可知,无论指针指向什么数据类型,其所占字节数都是 4。
空指针和野指针
空指针
指针变量指向内存中编号为0的空间叫做空指针。
用途:用于初始化指针变量。
注意:空指针指向的内存是不可以访问的。编号为0 ~ 255的内存地址是系统占用的,因此不可以访问。
野指针
指针变量指向非法的内存空间。
int main() {
// 定义一个指针,让它指向某个内存地址,这就是非法的。
int* p = (int *)0x1100;
// 访问野指针报错
cout << *p << endl;
return 0;
}
const 修饰指针
常量指针
const 修饰指针 称为 常量指针。
const int* p = &a;
指针常量
const 修饰常量 称为 指针常量。
int* const p = &a;
const 即修饰指针又修饰常量
const int* const p = &a;
记忆技巧
const int* p:const在前,* 在后,就叫常量指针;const后紧跟着 *,那么 *p 就不能操作,所以 *p = 20;就是错误的操作。
int* const p:*在前,const在后,就叫指针常量。const后紧跟着 p ,那么 p 就不能操作,所以 p = &b; 就是错误的操作。
指针访问数组
#include<iostream>
using namespace std;
int main() {
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
int* p = arr;
for (int i = 0; i < 10; i++) {
cout << *p << endl;
p++;
}
return 0;
}
地址传递
指针传递可以改变实参的值(形参无法改变实参的值)。
#include<iostream>
using namespace std;
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int a = 10;
int b = 20;
swap(&a, &b);
cout << "a = " << a << endl; // 20
cout << "b = " << b << endl; // 10
return 0;
}
指针数组函数的案例
实现冒泡排序:
#include<iostream>
using namespace std;
void bubbleSort(int* arr, int length) {
for (int i = 0; i < length - 1; i++) {
for (int j = 0; j < length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void printArray(int* a, int len) {
for (int i = 0; i < len; i++) {
cout << a[i] << " ";
}
}
int main() {
int arr[10] = { 51,26,83,42,75,39,41,97,115,382 };
int length = sizeof(arr) / sizeof(arr[0]);
// 冒泡算法
bubbleSort(arr, length);
// 打印数组
printArray(arr, length);
return 0;
}