C/C++中的指针(笔记)-指针基础知识总结
1、指针概述
2、指针和指针变量
内存区的每一个字节都有一个编号,就是“地址”
如果在程序中定义了一个变量,在对程序进行编译或者运行时,系统会给这个变量分配内存单元,并确定他的内存地址(编号)
指针的实质就是内存地址,指针就是地址,地址就是指针
通常我们叙述时会把指针变量简称为指针,实际他们的含义不一样
3、指针的定义和使用
//1指针也是一种数据类型
//p 是一个变量,p的类型是int*
int * p ; p = (int*)123; printf("%d\n",(int)p)
// 指针指向谁,就把谁的地址赋值给指针
int a = 10; p = &a; printf("%p,%p\n",p,&a);
// 直接操作指针变量本身没有意义
// 需要操作*p ,操作指针所指向的内存
*p = 100 //*p 相当于a
见图理解:
4、指针变量和指针所指向内存的区别
//*有两层含义
定义变量时 ,*代表的是类型 ,它是指针类型int *
在使用变量时,*代表操作指针所指向的内存
5、野指针
野指针就是保存没有意义地址的指针变量
6、空指针
//防止随便用指针
//空指针,给指针变量赋值为Null
//Null就是数字0
7、指针大小
//32位编译器用32位大小(4字节)保存地址
//64位编译器用64位大小(8字节)保存地址
8、多级指针
//如何定义一个合适类型的变量,保存另一个变量的地址
//在需要保存变量地址的类型基础上加一个*
9、[ ] 不是数组的专属
内存就是一个大数组,指针可以用[ ]
10、万能指针
首先不能定义void的普通类型 void a ---报error(因为内存不知道要分配多少空间给a);
可以定义void * 因为只有两种情况,一种是32位的,一种是64位的,可以分配固定空间
万能指针:void * =void *******可以指向任何类型的变量,使用指针所指向的内存时,最好转换它本身的指针类型
例子:
void *p = Null; int a = 10; p =&a; 注意这里保存的是a的首地址 *p = 222; 这里会报错 ,因为*p不能确定给它多少内存空间,如果是int *那么是给4个字节/char*是给一个字节,
但是void*,不能确定是给多少个字节,
&a只是保存的是首地址,不能确定位数就不能确定尾地址要转换为 * ( (int*) p ) = 222; //不做类型转换就无法确定步长,就无法确定操作多长的内存
11、指针步长
//1指针的加法不是传统的加法,
//2步长由指针指向的数据类型决定
int a; int *p = &a; printf(“p: %d,p=1;%d\n”,p,p+1); // p:1637816 ,p+1:1637820 说明int占4个字节 char b; int *q= &b; printf(“q: %d,q=1;%d\n”,q,q+1); // q:1637795 ,q+1:1637796 char占一个字节
12、const修饰的指针变量
//指针变量的含义
//指针所指向的空间
int a =10; int *p1 = &a; *p1 = 100;// 等价于操作a, *p1操作指针所指向的空间 p1 = Null; //操作指针变量 // const 修饰*,代表指针所指向的内存是只读的 const int *p2 = &a; *P2 = 100; //这里会报错,因为*p2已变为只读 p2 = Null;//这里操作的是指针变量 //上面的等价于(看const的位置): int const *p3 = &a; *p3 = 100;//也会报错 //const 修饰指针变量,代表指针变量的值为只读 int * const p4 = &a; *p4 = 100;//OK p4 = Null;//err
const int * const p4 = &a;//都不能改,全是只读