ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C 指针运算(mooc)

2021-04-11 11:04:50  阅读:133  来源: 互联网

标签:mooc 运算 int void 地址 printf sizeof 指针


  • *p++; // ++ 的优先级比* 高,这条命令意思是取出p所指的数据,顺便把p移到下一个位置去。 常用于数组连续空间的操作。
  • 指针可以做加减运算,比较运算 >,>= ,<, <=, != ,==不可以做乘除运算,因为毫无意义。
  • 0地址:
    • 内存中有0地址,但是0地址通常是一个不能随便碰的地址。所以指针不应该具有 0 值。
    • 因此可以用0地址来表示特殊的事情:(1)返回的指针是无效的。(2)指针没有被真正初始化(先初始化为0)
    • NULL是一个预定义的符号,表示0地址。 有的编译器不愿意你用0来表示 0 地址
  • 指针的类型:无论指向什么类型,所有的指针大小都一样,因为都是地址。  但是指向不同类型的指针是不能直接相互赋值的。
    int *p;
    char *q;
    // 如果把q的地址赋给p,那么*p=0;就会把q指向的地址连续4个字节单元全部赋值为0,而不是1个字节。这样会导致bug。

     

  • 指针的类型转换:void* 表示不知道指针指向什么东西。计算时与char* 相同,但不相通。
  • int  *p = &i;  
    void * q = (void*) p;
     // 转换p的类型 并没有改变p所指的变量的类型,即i的类型还是int。q不会把i当作是int 类型,而是认为i 是void。p还是认为i 是int。

    通过下面测试代码也可以知道

    #include <stdio.h>
    
    int main()
    {
       /* 我的第一个 C 程序 */
       int i = 5;
       int *p = &i;
        void * q = (void *) p;
        printf("p=%p\n",p);
        printf("q=%p\n",q);
        printf("&i=%p\n", &i);
        printf("sizeof(p)=%d\n", sizeof(p));
        printf("sizeof(q)=%d\n", sizeof(q));
        printf("sizeof(i)=%d\n", sizeof(i));
        printf("sizeof(*p)=%d\n", sizeof(*p));
        printf("sizeof(*q)=%d\n", sizeof(*q));
       return 0;
    }
    
    // output
    p=0x7ffd659a756c
    q=0x7ffd659a756c
    &i=0x7ffd659a756c
    sizeof(p)=8
    sizeof(q)=8
    sizeof(i)=4
    sizeof(*p)=4
    sizeof(*q)=1
    View Code

     

  • 指针的应用:
    • 需要传入较大的数据时用作参数
    • 传入数组后对数组做操作
    • 函数返回不止一个结果
    • 动态申请内存
  • free 释放的内存空间必须是之前申请来的,而且必须是申请的内存的首地址。意思是不能把其他变量的地址给free掉(不是申请来的)。
    int *p = (int *) malloc(10*sizeof(int));
    p++;
    free(p);  //error
    // 传入的不是首地址

    对于小程序而言,忘记free 影响不大,程序运行期间造成的内存泄露在程序运行完以后,操作系统会清理。但是对于大程序,服务程序(常驻的,一直运行)忘记free会导致及其严重的后果。因为程序没有运行结束,操作系统也不会清理的。

标签:mooc,运算,int,void,地址,printf,sizeof,指针
来源: https://www.cnblogs.com/bneglect/p/14643193.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有