为什么要使用指针?
1.函数的值传递,无法通过调用函数,来修改函数的实参
2.被调用函数需要提供更多的"返回值"给调用函数
3.减少值传递时带来的额外开销,提高代码执行效率
---> int a[10] ==> 40 字节
int *p; p=a; ==> 4 字节
指针的定义
int *p; // int *p1, *p2;
或者
int* p; // int* p1,p2; //p1 是指针, p2 只是整型变量
或者
int * p;
或者
int*p;//不建议
指针注意:
32 位系统中,int 整数占 4 个字节,指针同样占 4 个字节
64 位系统中,int 整数占 4 个字节,指针占 8 个字节
%p:格式控制符
"%p"中的p是pointer(指针)的缩写
一般以 > 十六进制整数 < 方式输出指针的值,附加前缀0x
打印地址 --> 指针即地址
//使用 16 进制打印,把地址值当成一个无符号数来处理
printf("p1=0x%p\n", p1);
printf("p1=0x%x\n", p1);
printf("p1=0x%X\n", p1);
int a = 8;
int *p= &a;
cout<<*p<<p;
--> 结果:*p=8 || p=a的地址
==> *p = a:* 特殊运算符:解引符
什么是空指针?
空指针,就是值为 0 的指针。(任何程序数据都不会存储在地址为 0 的内存块中,它是被操作系
统预留的内存块。)
int *p = 0;
或者
int *p = NULL; //强烈推荐
空指针的使用
1)指针初始化为空指针
int *select = NULL;
目的就是,避免访问非法数据。
*p++ 的概念
在 p 当前地址的基础上 ,自增 p 对应类型的大小, 也就是 p = p+ 1*(sizeof(指针类型));
如指针 + 1,并不是在指针地址的基础之上加 1 个地址,而是在这个指针地址的基础上加 1 个元素占用的字节数。
(1)指针和指针可以做减法操作,但不适合做加法运算;
(2)指针和指针做减法适用的场合:两个指针都指向同一个数组,相减结果为两个指针之间的元素数目,而不是两个指针之间相差的字节数
(3)不同类型的指针不允许相减
void * 空类型指针
1.不允许做算术运算!
2.可以做强制转化
3.其他类型可以转化为void *指针