C++学习 2 指针
指针:指针保存的是数据的地址;
#include<iostream> using namespace std; int main() { //1、定义指针 int a = 10; //指针定义的语法:数据类型 * 指针变量名; int * p; //让指针记录变量a的地址 p = &a; cout << "a的地址为:" << &a << endl; cout << "指针p为:" << p << endl; //2、使用指针 //可以通过解引用的方式来找到指针指向的内存 //指针前加 * 代表解引用,找到指针指向的内存中的数据 *p = 1000; //解引用指针p,找到p里的数据,并赋值1000 cout << "a=" << a << endl; cout << "*p=" << *p << endl; return 0; }
空指针:指针变量指向内存中编号为0的指针;
作用: 初始化指针变量;
注意: 空指针指向的内存是不可以访问的。0~255之间的内存编号是系统占用的,因此不可访问;
野指针:指针变量指向非法的内存空间;在程序中,应尽量避免使用野指针;
const修饰指针:
const修饰指针有三种情况:(左定值,右定向 )
1、const修饰指针 --- 常量指针 const在指针左侧,指针的值不可以修改,但指向可以修改。
eg: const int * p = &a;
*p = 20; // 错误,指针指向的值不可以修改
p = &b; // 正确,指针的指向可以修改
2、const修饰常量 --- 指针常量 const在指针右侧,指针的指向不可以修改,但值可以修改。
eg: int * const p = &a;
*p = 20; // 正确,指针指向的值可以修改
p = &b; // 错误,指针的指向不可以修改
3、const即修饰指针又修饰常量 指针的指向和指向的值都不可以改
eg: const int * const p = &a;
*p = 20; // 错误,指针指向的值不可以修改
p = &b; // 错误,指针的指向也不可以修改
指针和数组
作用:利用指针访问数组中的元素
#include<iostream> using namespace std; int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; cout << "第一个元素:" << arr[0] << endl; int * p = arr; //指向数组的指针,arr就是数组首地址 cout << "指针访问的第一个元素:" << *p << endl; p++; //指针向后偏移4个字节 cout << "指针访问的第二个元素:" << *p << endl; cout << "利用指针遍历数组" << endl; int * p2 = arr; for (int i = 0; i < 10; i++) { //cout << arr[i] << endl; cout << *p2 << endl; p2++; } system("pause"); return 0; }
指针和函数
#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; //swap01 a=20,swap01 b=10形参发生改变 } void swap02(int * p1 , int * p2) //地址传递 { int temp = *p1; *p1 = *p2; *p2 = temp; cout << "swap02 a=" << *p1 << " " << "swap02 b=" << *p2 << endl; //swap02 a=20,swap02 b=10形参发生改变 } int main() { //指针和函数 int a = 10; int b = 20; //1、值传递 //swap01(a, b); //cout << "a=" << a <<" " << "b=" << b << endl; //值传递 a=10,b=20 实参不发生改变(不可修饰实参) //2、地址传递 swap02(&a, &b); cout << "a=" << a << " " << "b=" << b << endl; //地址传递 a=20,b=10 实参发生改变(可修饰实参) system("pause"); return 0; }