一、指针变量的定义和使用
int a=10;
int *p=&a; // 指针p指向a的地址 (指针p中,保存的是a的地址)
int *p=100; //则a=100,可以通过指针来修改a的值
二、指针所占的内存空间
int a = 10;
int* p = &a;
不管什么数据类型
32位操作系统,指针占用内存4字节 (指针保存的内容就是地址)
64位操作系统,指针占用内存8字节
sizeof(p) = 4;
sizeof(int *) = 4;
sizeof(double *) = 4;
sizeof(char *) = 4;
三、空指针
空指针作用:用来初始化变量
空指针指向 地址编号为0
空指针不允许访问 (0~255之间内存系统占用,不允许访问)
int* p = NULL; //#define NULL 0
*p = 100; //错误,空指针不允许访问
四、野指针
野指针,指针变量指向非法内存空间 (危险)
在程序中,尽量避免出现野指针
int* p = (int*)0x1100; //16进制转换为指针类型
空指针和野指针都不是我们申请的空间,所以不要访问
五、const修饰指针
1、const修饰指针(常量指针)
const int *p=&a;
指针的指向可以修改 (p =&b; //正确,指向改变了)
指针指向的值不能修改 (*p = 20; //错误,指向的值改变了)
2、const 修饰常量(指针常量)
int* const p=&a;
指针的指向不可以改 ( //p=&b; 错误,指向改变 )
指针指向的值可以修改 ( //*p=20; 正确,指向的值由 10 变为 20 )
3、const 即修饰指针,又修饰常量
const int* const p=&a;
指针的指向不可以改 ( //p=&b; 错误,指向改变 )
指针指向的值不可以修改 ( //*p=20; 错误,指向的值由 10 变为 20 )
六、指针和数组
利用指针访问数组元素
arr[ i ];
*(p+i); //指针占4字节
*p1; p1++; //p指的是(保存的是)arr的首地址,p1++,就是里面的地址++
七、指针和函数
指针做函数参数,修改实参的值
//值传递 (不改变实参值)
swap(a, b); //void swap(int x, int y)
//地址传递;(改变实参值)
swap02(&a, &b); //void swap02(int* p1, int* p2)
//引用 (改变实参值)
swap03( a, b); //void swap03(int& x, int& y)
八、指针,指向数组后,可以通过指针的下标方式访问,数组
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p2 = arr;
for (int i = 0; i < 10; i++)
{
cout << p2[ i ] << " ";
}