野指针+空指针+万能指针

2.3 指针大小

l  使用sizeof()测量指针的大小,得到的总是:4或8

l  sizeof()测的是指针变量指向存储地址的大小

l  在32位平台,所有的指针(地址)都是32位(4字节)

l  在64位平台,所有的指针(地址)都是64位(8字节)

 

       int *p1;

       int **p2;

       char *p3;

       char **p4;

       printf("sizeof(p1) = %d\n", sizeof(p1));

       printf("sizeof(p2) = %d\n", sizeof(p2));

       printf("sizeof(p3) = %d\n", sizeof(p3));

       printf("sizeof(p4) = %d\n", sizeof(p4));

       printf("sizeof(double *) = %d\n", sizeof(double *));

 

7.2.4 野指针和空指针

指针变量也是变量,是变量就可以任意赋值,不要越界即可(32位为4字节,64位为8字节),但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。所以,野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。

 

       int a = 100;

       int *p;

       p = a; //把a的值赋值给指针变量p,p为野指针, ok,不会有问题,但没有意义

       p = 0x12345678; //给指针变量p赋值,p为野指针, ok,不会有问题,但没有意义

       *p = 1000;  //操作野指针指向未知区域,内存出问题,err

 

但是,野指针和有效指针变量保存的都是数值,为了标志此指针变量没有指向任何变量(空闲可用),C语言中,可以把NULL赋值给此指针,这样就标志此指针为空指针,没有任何指针。

       int *p = NULL;

 

NULL是一个值为0的宏常量:

#define NULL    ((void *)0)

 

7.2.5万能指针void *

void *指针可以指向任意变量的内存空间:

       void *p = NULL;

       int a = 10;

       p = (void *)&a; //指向变量时,最好转换为void *

       //使用指针变量指向的内存时,转换为int *

       *( (int *)p ) = 11;

       printf("a = %d\n", a);

 

7.2.6 const修饰的指针变量

       int a = 100;

       int b = 200;

//指向常量的指针

       //修饰*,指针指向内存区域不能修改,指针指向可以变

       const int *p1 = &a; //等价于int const *p1 = &a;

       //*p1 = 111; //err

       p1 = &b; //ok

//指针常量

       //修饰p1,指针指向不能变,指针指向的内存可以修改

       int * const p2 = &a;

       //p2 = &b; //err

       *p2 = 222; //ok

指针
指针的定义和使用:
1、指针:是一种数据类型 指针变量也是一种变量
2、指针格式: 对应的数据类型 * p:指针类型变量 用来指向一个变量的地址
3、通过指针修改变量的值
 *p = 200;
4、指针类型在内存中的大小 : 在32位操作系统中所有指针大小都是4个字节大小 
  打印指针内存大小格式: sizeof(int *) || sizeof(p)
5、内存按照 unsignned int 为每个一个内存分配编号
6、讲解:
①定义变量 int a =10;  数值10 存在内存 为a开辟的空间中 a的地址为0xff00 
②定义指针 int * p = &a  指针变量p 在内存中存贮的是 a的地址 0xff00,指针变量p 在内存中的大小在32位系统中都是4个字节大小
③*p = 200 通过操作指针变量p 所存储的 a的地址 来改变a的值
④指针p 有一个自己的内存地址 指针p地址 与 定义变量a的地址 0xff00不同
 

野指针、空指针与 万能指针
1、野指针:野指针是指向一个未知的内存空间,可能在读写的时候出现错误。
 0-255都是系统保留的 不可以读,不可以写
2、空指针 没有指向任何的地址(其指向0的地址)
空制指针就是指向内存编号为零的空间,操作该内存空间会报错,一般情况空指针用于程序条件判断
3、万能指针:void *  指针可以指向任意变量的内存空间
 
const修饰指针
1.通过指针修改const修饰的常量
const int a = 10;
int *p += &a;
*p = 100;
a =100;
可以通过1级指针修改一个常量的值
 
2.const修饰指针类型 int * 不能改变指针变量指向的内存地址的值 但是可以改变指针指向的地址 
const int *p = &a
p=&b
*p = 100
可以改变指针指向的地址
 
3.const修饰指针变量    能改变指针指向地址的值,但不能改变指针指向的地址
 
int * const p = &a;
*p = 100;
 p=&b
可以修改指针指向地址的值
 
4.const修饰指针类型修饰指针变量  不能改变指针指向的的值 也不能改变指针指向的地址 
const int * const *p = &a;
*p =100;
p = &b;
 
 

指针和数组、指针运算:
1、数组名是数组的首地址,这是一个常量
2、指向数组的指针 
  格式int arr [10] = { 0 } ;  
      int * p = arr;
  当操作指针的时候 间接操作了数组 arr[i] = p[i];
3、指针的降级操作 ,取当前地址的值:p[5]、*p 
4、对指向数组的指针进行加减操作,可能会导致数组下标越界 。
5、相同的类型的指针相减  结果是两个指针相差的长度
区别:数组名通过sizeof可以求出数组大小,指针只包含数组的首地址信息
课后练习题:输入格式:【  空格  你好 空格   】输出格式为【你好】
指针数组
1、存储char *类型的地址数组
 char * arr[] ={"hello","world","niao","baobei"};
2、指针数组,它是数组,数组的每个元素都是指针类型。
多级指针:
1、如果二级指针前面加一个* 代表一级指针的值
2、二级指针前面加** 代表指针指向一级指针指向地址的值,加*降维度
3、如果n级指针在前面加n个*就是指针指向一级指针指向地址的值
 

猜你喜欢

转载自www.cnblogs.com/WangGuiHandsome/p/9882491.html