C语言--指针详解1

一,指针
    1.地址
        内存单元的编号叫地址;
    2.指针
        内存单元的地址叫指针;
        变量的地址叫指针;
    3.指针变量
        存储变量地址的变量叫指针变量;
        
    说明:
        在不作区分的情况下,将地址指针指针变量统称指针;
    4.指针变量的形式
        存储类型数据类型*指针变量名;
        例如:
            int * p;
        说明:
            存储类型:同普通变量,指针变量本身的存储类型;
            数据类型:既可以是基本类型,也可以是struct,也可以是void,还可以是指针;
                      此数据类型是指针指向空间内容的数据类型;(重点)
            *:表示变量为指针变量;
            指针变量名:符合命名规则;
    指针变量的初始化
        存储类型数据类型*指针变量名=地址值; eg1
        
        :
            int i = 10;
            int * p =&i; //由于p指针指向的数据为int型,所以需要给指针变量putr int型变量的地址; eg2
        
        :
            char ch ='a';
            char * q =&ch;
    6.&与*
        &:取变量的地址
        *:
            1>在定义指针变量时,*用来说明定义的变量为指针变量;
                例如:
                    float * p; // *说明定义的变量p为指针变量;
            2>在定义之后,指针变量名前加*,含义是取指针指向空间的值;(解引用)
                例如:
                    int i = 10;
                    int * p;
                    p =&i; //给指针变量p赋i的地址
                    printf(“i =%d * p =%d \ n”,i,* p);
    注意:
        &与*互为逆运算;
        例如:
            int i = 10;
            的printf(”
            
    7.指针的运算
        本质:地址的运算
        定义指针变量px和py;
        
        1>算数运算:(+ - ++ - )
            px + n:指针向地址大的方向偏移n个数据类型;(此数据类型为指针指向内容的数据类型)
            px-n:指针向地址小的方向偏移n个数据类型;(此数据类型为指针指向内容的数据类型)
            px ++://等价:px = px + 1;指针向地址大的方向移动1个数据类型;(此数据类型为指针指向内容的数据类型)
            px--:指针向地址小的方向移动1个数据类型;(此数据类型为指针指向内容的数据类型
            PX-PY:两指针之间相差的数据类型的个数;
            
            
            例如:
                int a [10] = {1,2,3,4,5,6,7,8,9,10};
                int * p =&a [0]; //
                int * q =&a [7];
                printf(“p =%p p + 3 =%p \ n”,p,p + 3); // p = 0xbffb8334 p + 3 = 0xbffb8340
                printf(“q =%p q-3 =%p \ n” ,q,q-3); // q = 0xbffb8350 q-3 = 0xbffb8344
                printf(“qp =%d \ n”,qp); // qp = 7
                    
            注意:
                n为整数
        2>关系运算(> <> = <= ==!=)
            eg1:
                int * p; //“野指针“
                * p = 10; //不允许通过野指针访问野指针指向的空间; eg2
                    
            :
                int * p = NULL; // stdio.h定义的宏值#define NULL 0
                if(NULL == p)/ /判断指针是否为有效的指针
                {
                    return;
                }
                
                * p = 10; //错误
        3>赋值运算eg1
            :
                int i = 10;
                int * p =&i;
            eg2:
                int i = 10;

                int * q = p;
            eg3:
                int a [10];
                int * p = a;
二,指针与数组
    通过指针操作数组;
    1,一级指针与一维数组
        例如:
            int a [10] = {1,2,3,4,5,6,7,8, 9,10};
            int * p = a; // int * p =&a [0];
            int i;
            for(i = 0; i <10; i ++)
                printf(“%d”,a [i]);
            的printf( “\ n”);
            
            for(i = 0; i <10; i ++)
                printf(“%d”,p [i]);
            printf(“\ n”);
    结论:
        1> 数组中第i个元素的表示:(i = 0,1,2,.....)
            a [i] p [i] *(a + i) *(p + i)*(&a [i])*(&p [i])
        2>
            &a [i]&p [i](a + i)(p + i)         
三,        字符指针
    1.形式
存储类型char *指针变量名; eg1
        :
            char ch ='a';
            char * p =&ch; //
            * p ='b';
            的printf( “* P =%C \ n”,* P);
        eg2:
            字符指针操作字符串(重点)char * p =“hello world”; //将字符串的首地址赋予p指针
            printf(“* p =%c \ n”,* p); // * p ='h'
            * p ='a'; // ERROR不能通过指针修改常量区的东西
        例子:
            char * p;
            p =“你好世界”;
            printf(“* p =%c \ n”,* p); // * p ='
            h'printf(“p =%s \ n”,p);

            

            char * p = NULL;
            p =“你好世界”;
        eg4:
            char ch [20] =“hello world”;(√)
            char ch1 [20];
            ch1 =“hello world”;(×)//数组名不能作为左值
        eg5:
            char ch1 [20];
            ch1 [20] =“hello world”;(×)// ch1 [20]表示的是数组ch1中的第21个元素,越界
        eg6:
            char ch [20] =“hello world”; //将常量区的“hello world”拷贝贝份到ch的空间
            * ch ='a';
            printf(“%s \ n”,ch); //结果:aello world
    

实例:
    1,求一个字符串的长度。(指针) 

    的#include <stdio.h>中

    int main()
    {
        char ch [64];
        得到(CH);

        int num=0;
        char *p = ch;

        while(*p != '\0')
        {
            num++;
            p++;
        }

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

        return 0;
    }

    2、计算一个字符串的空格数,并删除全部空格;
    
    #include<stdio.h>

    int main()
    {
        char a[64];
        gets(a);

        int i,j,num=0;
        for(i=0;a[i]!='\0';i++)
        {
            if(a[i] == ' ')
            {
                num++;
                for(j=i;a[j]!='\0';j++)
                    a[j] = a[j+1];
                i--;
            }
        }
        
        printf("num=%d %s\n",num, a);

        return 0;
    }

    3、用指针给一个数组赋值,并打印。
    
    #include<stdio.h>

    int main()
    {
        int a[10];
        int len = sizeof(a) / sizeof(int);
        int *p = a;
        int i;
        for(i=0;i<len;i++)
            scanf("%d",p++);
        p = a;

        for(i = 0; i <len; i ++)
            printf(“%d”,p [i]);
        的printf( “\ n”);

        返回0;
    }        
            
            
            
            
        

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值