指针 (初阶)

一.什么是指针

二.指针和指针类型

三.野指针

四.指针运算

五.指针和数组

六.二级指针

七.指针数组

1.什么是指针:

指针理解的两个要点:

                             1 : 指针是内存中一个最小的单元的编号,也就是地址。

                             2 :平时口头语说的指针,通常指的是指针变量,是用来存放内存地址的变量。

                             总结:指针就是地址,口头语说的指针通常指的是指针变量,

指针变量:

                            我们可以通过&(取地址操作符)取出变量的内存地址,把地址可以存放在一个变量中,这个变量就是指针变量。

总结:

         指针变量,用来存放地址的变量 (存放在指针中的值都被当成地址来处理)

 一个小的单元到底是多大?(1个字节)

                   在32位机器上,地址由32个0或32个1组成的二进制序列,那地址就得用4个字节的空间存储,所有一个指针变量大小是4个字节

                    在64位机器上,地址由64个0或64个1组成的二进制序列,那地址就得用4个字节的空间存储,所有一个指针变量大小是8个字节

总结:

         指针的在32位平台是4个字节,在64位平台是8个字节

2.指针的类型:

 char   * pc = NULL ;
 int   * pi = NULL ;
short * ps = NULL ;
 long   * pl = NULL ;
 float * pf = NULL ;
 double * pd = NULL ;
                                    char* 类型的指针是为了存放 char 类型变量的地址。
                                    short* 类型的指针是为了存放 short 类型变量的地址。
                                    i nt* 类型的指针是为了存放 int 类型变量的地址。

指针的解引用:

3.野指针:

                 概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

3.1野指针成因:
                          1. 指针未初始化

                          2. 指针越界访问

                         3. 指针指向的空间释放
                            3  如何规避野指针
1. 指针初始化                       如果不知道初始化什么值,为了安全,初始化为NULL(int *p=NULL)
2. 小心指针越界                  
3. 指针指向空间释放,及时置 NULL   
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性

4.指针运算:

指针 +- 整数
指针的关系运算
指针 - 指针
                           
                              
数组和指针:
                     
结论: 数组名表示的是数组首元素的地址 。(2种方式除外,sizeof(数组名),&数组名)
sizeof(数组名):数组名单独放在sizeof内部,数组名表示整个数组,计算的是数组的大小,单位是字节
&数组名:数组名表示整个数组,取出的是整个数组的地址,数组的地址和数组首元素的地址,值是一样的,但类型和意义不一样  
那么这样写代码是可行的:
                                          int arr [ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 };
                                          int * p = arr ; //p 存放的是数组首元素的地址
既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能
所以 p+i 其实计算的是数组 arr 下标为 i 的地址。
那我们就可以直接通过指针来访问数组。
二级指针:
                  指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?
*ppa 通过对 ppa 中的地址进行解引用,这样找到的是 pa *ppa 其实访问的就是 pa .
 int b = 20 ;
* ppa = & b ; // 等价于 pa = &b;
**ppa 先通过 *ppa 找到 pa , 然后对 pa 进行解引用操作: *pa ,那找到的是 a .
** ppa = 30 ;
// 等价于 *pa = 30;
// 等价于 a = 30;
指针数组:
指针数组是指针还是数组?
答案:是数组。是存放指针的数组。
数组我们已经知道整形数组,字符数组
int arr1 [ 5 ];
char arr2 [ 6 ];
那指针数组是怎样的?
int* arr3 [ 5 ]; // 是什么?
arr3 是一个数组,有五个元素,每个元素是一个整形指针。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值