初始指针
指针(pointer)简介
-
指针是一个值为内存地址的变量(或数据对象)
-
地址与操作系统有关。内存地址是随机的。 指针间接获取地址,变量直接获取地址。
-
-
声明及初始化指针变量
-
基本用法: 数据类型*指针变量名;
-
例如: int * ptr_num; char * ptr_name; ( int num =10; int * ptr_num; ptr_num = #)
-
-
声明时尽量使用第一种理解方式。
-
-
取地址可以直接访问
在C++中通常那个情况下,ch 默认指的是一个字符串
需要对 ptr_ch 进行强制转换。 (void*)任意类型
空指针
空指针;空指针不指向任何对象,在试图使用一个指针之前可以首先检查是否为空
没有赋值的指针为野指针,可能篡改内存的地址(若关键地址被改,危险)
void指针*
一种特殊的指针类型,可以存放任意对象的地址
void* 的类型不清楚,不能直接修改,编译器会拒绝。。。
指针小结
数组中存指针,省空间。
引用
引用就是为了对象起了另一个名字(引用即别名)
指向常量的引用是非法的。
const double & ref =100; 指向常量的引用前加const
指针和引用
指针和数组
指针运算
指针描述的是位置
自减 ---------------- 向下移动
自加------------------向上移动
动态分配内存
p-------栈区 在堆区分配了一块int 型空间
int *p = new int;
p++;(尽量不要用这种操作,太危险)
delete p;
p指向了下一块空间,但是 new int 这块空间还是存在的。只是没有指针指向那块空间,这个指针叫野指针,或者叫内存泄露。
**编译时 int num[56];
运行时 int *nums = new int[5]; **
运行时 (运行时才给地址) 堆内存中分配了5个内存空间,才把这个空间分配给这个地址。。。。这是地址大小,不是空间大小
而编译时是 直接分配
真正的内存在栈区,不在堆区
实操
数组逆序
二维数组与指针
5行3列的二维数组
p2[i][j 相当于 *( *(p2+i) + j)
指针小结
指针 是 变量(值是内存地址)
指针是一个16进制的数值 int *p = FFFF 不能这样
int p_num = # //定义的时候 &是取num的地址给 p_num,定义的时候 int 是指针类型
p_num = 112; 是取p_num的地址的值
int num1;
int & num = num1; 引用
const int& num = 89;
指针移动 ----实际上是变量存储地址的移动
double *p1-- p2++
每次移动8个字节
int num[10];
int *p_num =num;
sizeof(num) sizeof(p_num)
数组是有类型的!
int[]----------------