C语言 DAY08 指针01

1.概述

        地址编号:地址编号:就是计算机为了存储数据,每一个程序在32机中占4G,以一个字节为最小单位进行操作,每一个字节都有其对应的地址,该地址就是地址编。

        指针:地址编号的数据类型

        指针变量:存储地址编号的变量,其数据类型为指针

在32位机中一个指针占4B

64 位机中一个指针占 8B
代码:

#include

int main(int argc, char const *argv[])

{

    printf("char *的大小为:%ld\n",sizeof(char *));

    printf("int *的大小为:%ld\n",sizeof(int *));

    printf("short *的大小为:%ld\n",sizeof(short *));

    printf("long *的大小为:%ld\n",sizeof(long *));

    printf("float *的大小为:%ld\n",sizeof(float *));

    printf("double *的大小为:%ld\n",sizeof(double *));

    return 0;

}

2.指针变量

指针变量实质上是一个变量,存放的是数据类型为指针的地址编号

1.定义:

        数据类型   变量名

2.分类:

        char *  储存数据类型为字符型的地址编号        字符指针

        int    *  储存数据类型为整型的地址编号            整型指针

        short  *储存数据类型为短整型的地址编号         短整型指针

        long   *储存数据类型为长整型的地址编号         长整型指针

        float   *储存数据类型为float的地址编号              单精度浮点型指针

        double *储存数据类型为double的地址编号       双精度浮点型指针

如:

        int  num = 10;

        int  *p ;

注意:

        如果同时定义多个指针变量的时候,每个指针变量前都要加*

       如:

        void fun()

        {

                int a,b,c;

                int *p1,*p2,*p3;

        }

初始化:

1,当指针变量是局部变量,在其定义时没有给其值,此时系统将随机为其给一个值,这种指针称为野指针
        如:
        int *p;
2,当指针变量值等于NULL时,这种指针称为空指针
        如:
        int *p = NULL;
3,定义指针变量时赋真实的地址
如:
        int num = 10;
        int *p = #
如:

        int num = 10;

        int *p ;

        p = #

运算符:

&

        作用:取地址

        &要取地址的变量

        注意:只能获取变量的地址

        代码 :

                #include

                char c = 'a';

                int main(int argc, char const *argv[])
                {
                        int num = 10;
                        int *p = #
                        printf("p = %p\n",p);
                        char *p2 = &c;
                        printf("p2 = %p\n",p2);
                        //int *p3 = &10;
                        const int num02 = 10;
                        int *p4 = &num02;
                        printf("p4 = %p\n",p4);
                        return 0;
                }

*

     作用:取值或改值

        *指针变量名   

示例 

        #include

        int main(int argc, char const *argv[])
        {
                int num = 10;
                int *p = #//此时* 表示变量 p int 型的指针变量
                printf("*p=%d\n",*p);//此时* 表示为取值
                *p = 1;//修改p 指向的地址的值
                printf("num=%d\n",num);
                return 0;
        }

3.指针类型

指针本身的类型

        口诀:将指针变量的变量名去除,剩余的就是指针本身的类型

        如:

                int *p1;// int *

                int **p2;//int **
        
                int (*p)(int int);//int (*)(int,int)
                ...
        示例:
                int num = 10;
                int *p = &num ;
                char *p2 = #

指针指向的数据的数据类型

        口诀:将指针变量的变量名和与它离得最近的*去除 , 剩余的就是指针本身的类型
        如:
                

                int *p1;// int 

                int **p2;//int *
        
                int (*p)(int int);//int (int,int)

取值宽度

        指针变量的数据类型的长度就是指针的取值宽度
        char *   取值宽度 1
        int *      取值宽度  4
        float *   取值宽度  4

单位跨度(步长)

        就是地址在进行加减时,地址所增减的数据类型的长度(字节数)
        
         int * 单位跨度为4字节
        char * 单位跨度为1字节
        short * 单位跨度为2字节
        示例:
                 #include
        int main(int argc, char const *argv[])
        {
                int num = 0x01020304;
                char *p = (char* )#
        /*
        注意: liunx 系统中数据存储将倒序
        所以num 在内存中存储的顺序为
        0x04 0x03 0x02 0x01
        将num 地址强制转换为 char * 类型
        此时取值宽度为1 字节 , 单位跨度为 1 字节
        p为首个字节存储的地址 +1, 加的是一个单位跨度即 1 字节
        所以从第二个字节开始取1 个字节长度的数据
        即0x03
        */
                printf("%#p\n",*(p+1));
        /*
        将num 地址强制转换为 short * 类型
        此时取值宽度为2 字节 , 单位跨度为 2 字节
        p为首个字节存储的地址 +1, 加的是一个单位跨度即 2 字节
        所以从第三个字节开始取2 个字节长度的数据
        即:0x0102
        */
                short * p2 = (short *) #
                printf("%#p\n",*(p2+1));
                return 0;
        }

4.void

作用

        void与指针结合作为一种指针类型,void *,这种指针我们称为万能指针,意味着任何一种地址都可以赋值给类型的指针变量

示例      

#include
int main(int argc, char const *argv[])
{
        int num01 = 10;
        char c = 'a';
        short s = 1;
//
        int *p1 = &num01;
        char *p2 = &c;
        short *p3 = &s;
//
        void *p4 = &num01;
        void *p5 = &c;
        void *p6 = &s;
        return 0;
}

5.指针变量使用的注意事项

1, 野指针操作会出现段错误

        定义一个局部变量的指针,并不给其赋值,它将不知道指向哪一块地址,所以叫野指针

        代码:

                void fun01()

                {

                //野指针
                        int *p;
                        printf("*p=%d\n",*p);
                }
2,空指针操作会出现段错误
    定义一个NULL的指针,叫空指针
        代码:
        
         void fun02()
        {
                //空指针
                int *p = NULL;
                printf("*p=%d\n",*p);
        }
    
        
3, 不要对万能指针进行操作
        
         void fun03()
        {
                int num = 10;
                int *p = #
                printf("*p=%d\n",*p);
                void *p2 = #
                printf("*p2=%d\n",*p2);
        }
4, 操作指针变量不要越界
代码:
         void fun04()
        {
                int num = 0x01020304;
                int *p = #
                char *p2 = (char *) p;
                printf("%#p\n",*p2);
                printf("%#p\n",*(p2+1));
                char c = 'a';
                char * p3 = &c;
                //1
                int *p4 = (int *)p3;
                printf("%#p\n",*p4);
        }

你可能感兴趣的:(C语言,c语言,开发语言)