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;// 都不能改, 全是只读
C/C++ 中的指针(笔记)- 指针基础知识总结
来源: http://www.bubuko.com/infodetail-2975444.html