C++指针
1.概述
2.指针的定义与使用
3.指针与数组
4.指针与函数
1.指针的基本概念
内存区的每一个字节B都有以一个编号,这就是地址,eg:0x0033
指针的实质就是内存的地址
指针就是地址
地址就是指针
指针是内存单元中的编号
指针变量是存放地址的变量
#include<iostream>
using namespace std;
int main() {
//1.指针变量的定义
//通过 数据类型 * 指针变量名
int* p;//定义一个整型指针变量
//2.指针变量的赋值 指针变量名 = & 变量名
int a = 10;
p = &a;
cout << p << endl;
cout << &a << endl;
//3.指针变量的定义和赋值可以同时进行
int d=20;
int* c = &d;
//4.指针变量的使用
//1)直接使用变量名
cout << p << endl;
//获取到的是p所对应的存放的内容,也就是地址
//2)使用值,使用解引用符号“*”
cout << *p << endl;//*p所指向变量的内存空间
*p = 20;
cout << "==============" << *p << endl;
return 0;
}
2.指针的定义与使用
-
指针变量定义的语法:数据类型指针变量名
int p; -
指针变量赋值的语法:指针变量名=&变量名;
int a = 10;
p = &a; -
指针变量使用语法:指针变量名:直接获取它所获地址;*指针变量名:获取它所指向的地址所存放的内容
注意
空指针:指向编号为0的指针
#include<iostream>
using namespace std;
int main() {
int* p = NULL;
cout << p << endl;
return 0;
}
野指针:指向非法空间的指针
#include<iostream>
using namespace std;
int main() {
//野指针-指向非法内存空间
int* p = (int*)100;
cout << (int)p << endl;
cout << *p << endl;
return 0;
}
野指针和空指针都是我们申请的空间,无权限访问
const修饰指针(常量指针):可以修改指针本身,但不可以修改指针所指向的内存空间
const修饰的指针变量(指针常量):指针本身不可以修改,但是可以修改所指向的内存空间
const既修饰指针又修饰指针常量,都不可以修改
#include<iostream>
using namespace std;
int main() {
//1.无const修饰
int a = 10;
int b = 20;
int* p = &a;
cout << p << endl;
cout << *p << endl;
//2.const修饰的指针(常量指针)
const int* p1 = &a;
cout << "const修饰的指针(常量指针)" << endl;
cout << p1 << endl;
p1 = &b;
cout << "改变指针的指向" << endl;
cout << p1 << endl;
cout << "改变指针的内存空间" << endl;
// *p1 = 20;
cout << *p1 << endl;
//3.const修饰的指针变量(指针常量)
int* const p2 = &a;
cout << "const修饰的指针变量" << endl;
cout << p2 << endl;
cout << "改变指针指向" << endl;
// p2 = &b;
*p2 = 20;
cout << "改变指针的内存空间" << endl;
cout << *p2 << endl;
return 0;
//
}
3.指针数组
数组的本质:指向该数组首元素的指针
给指针加上(减去)某个整数值,结果仍然是指针
#include<iostream>
using namespace std;
int main() {
//指针数组
int arr[] = { 1,2,3,4,5 };
cout << arr[2] << endl;
cout << *(arr + 2) << endl;
//通过指针遍历数组
for (int i = 0; i < 5; i++) {
cout << *(arr + i) << endl;
}
return 0;
}
4.指针与函数
地址传递:使用指针作函数参数,可以修改实参的值
#include<iostream>
using namespace std;
void swap01(int a, int b) {
int temp = a;
a = b;
b = temp;
cout << "swap01:a" << a << "swap01:b" << b << endl;
}
//地址传递
void swap02(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
cout << "swap02:a" << *a << "swap02:b" << *b << endl;
}
int main() {
int a = 10;
int b = 20;
swap01(a, b);
cout << "main:a" << a << "main:b" << b << endl;
swap02(&a, &b);
cout << "=========================="<<endl;
cout << "main:a" << a << "main:b" << b << endl;
return 0;
}
冒泡算法
#include<iostream>
using namespace std;
void bubblesort(int* arr, int len) {
//实现冒泡排序
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - 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* arr, int len) {
for (int i = 0; i < len; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
int main() {
//1.创建数组
int arr[10] = { 3,1,5,2,4,6,8,7,10,9 };
cout << "排序前====================" << endl;
printArray(arr, 10);
//2.排序
cout << "排序后====================" << endl;
bubblesort(arr, 10);
printArray(arr, 10);
return 0;
}