1 C/C++ 指针 定义和使用
#include <iostream>
using namespace std;
int main() {
int a;//变量a的地址0x123
int* b;//变量b的地址0x234
a = 5;
b = &a;//把a的地址给b
cout << a<<endl; //5
cout << &a << endl; //0x123
cout << b << endl;//0x123
cout << *b << endl;//5
cout << *(&a) << endl;//5
}
数组
#include <iostream>
using namespace std;
int main() {
int* b;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//arr = &arr[0],数组名arr就是数组首元素arr[0]的地址
b = arr; //首元素地址给b
b = &arr[0];//首元素地址给b
cout << *b << endl; //arr[0]
cout << *(b + 1)<<endl; //arr[1]
}
2 指针占用空间
//在32位操作系统下:占用4个字节空间,64位下占8个字节。
//
//32位系统,不管是什么类型指针,都是占用4字节;
//64位系统,不管是什么类型指针,都是占用8字节;
//64位系统,选择x86——都是4个字节,选择x64——都是8个字节
int a = 10;
int* p = &a;
cout << "sizeof(char *)= " << sizeof(char *) << endl;
cout << "sizeof(int *)= " << sizeof(int*) << endl;
cout << "sizeof(float *)= " << sizeof(float*) << endl;
cout << "sizeof(double *)= " << sizeof(double*) << endl;
//64位系统,不管是什么类型指针,都是占用8字节;
//32位系统,不管是什么类型指针,都是占用4字节;
3 空指针
int main() {
int* p = NULL;
*p = 100;
return 0;
}
4 野指针
申请一个指针,随便指定一个内存空间,语法上没问题,编译器检测通过,但是运行出错
int main() {
int* p = (int *)0x1100;
cout << *p << endl;
return 0;
}
5 const修饰指针
技巧:
看const右侧紧跟着的是指针还是常星:
(1)const右侧紧跟指针,就是常量指针;指向可以修改;
(2)const右侧紧跟常量,就是指针常量;数值可修改;
int main() {
int a = 10;
int b = 20;
//1. 常量指针
//指针指向的值不可以改,指针的指向可以改
const int * p1 = &a; //同 int const * p1 = &a;
*p1 = 100; //错误
p1 = &b; //正确
//2.指针常量,
//指针指向的值可以改,指针的指向不可以改
int* const p2 = &a;
*p2 = 100; //正确
p2 = &b; //错误
//3.const既修饰针织,又修饰常量
//指针指向的值不可以改,指针的指向不可以改
const int* const p3 = &a;
*p3 = 100; //错误
p3 = &b; //错误
return 0;
}
5.1 常量指针 const int * p=&a; 同 int const * p1 = &a;
int a=10;
const int * p=&a;
5.2 指针常量 int * const p=&a;
int a=10;
int * const p=&a;
5.3 cons既修饰指针,又修饰常量 const int * const p = &a;
int a= 10;
const int * const p = &a;
6 指针和数组
7 指针和函数
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
void swap2(int *p1, int *p2) {//用指针接收实参地址,再对地址内容进行和交换
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
//指针和函数
int main() {
int a = 10, b = 20;
//1.值传递
swap(a,b);//实参并未改变,形参发生交换
cout << "sawp a= " << a <<" sawp b= "<< b << endl;
//2.地址传递
swap2(&a, &b);//传递实参的地址,改变实参
cout << "sawp2 a= " << a << " sawp2 b= " << b << endl;
return 0;
}
7 指针配合数组、函数案例
//交换(修改实参)
void swap2(int *p1, int *p2) {//用指针接收实参地址,再对地址内容进行和交换
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
//冒泡排序
void bubbleSort(int* arr,int n) {
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - 1 - i; j++)
if (arr[j] > arr[j + 1])
swap2(&arr[j],&arr[j+1]);
}
//打印输出
void print(int* arr,int n) {
for (int i = 0; i < n; i++) {
cout << *arr << endl;
arr++;
}
}
int main() {
int a[] = {2,5,8,3,6,9,1,4,7,10};
bubbleSort(a,10);
print(a,10);
return 0;
}