zoukankan      html  css  js  c++  java
  • 指针,别名

    最近一直在读《linux c 程序设计大全》(吴岳),收获颇丰啊。

    一,指针与别名

    直接上代码,代码一

    void f1(int*p,int*q)

    {

    *p=2**q;

    }

    代码二,

    void f2(int*p,int*q)

    {

    *p+=*q;

    *p+=*q;

    }

    这两段代码当然是第一个的效率高,代码一访问两次存储器,代码二访问四次存储器。不过这只是题外话^O^,真正要说的是这里面的陷阱。假设p指向a(a=3),q指向b(b=3),调用这两个函数的得到的功能一样,都变成了9,但是如果p和q同时指向a(a=3),这时调用f1,a变成了9,调用f2,则a变成了12!

    二,

    数组的指针,依然直接看代码

    #include<stdio.h>
    int main()
    {
    int (*p)[5];
    int a[5]={1,2,3,4,5};
    p=&a;
    int*ptr;
    ptr=(int *)(p+1);
    printf("%d\n",*(ptr-1));
    }
    这里的执行结果是什么呢?首先p是一个数组指针指向一个5*sizeof(int)大小的数组,因此,p+1使得指针移动了20个字节!所以,*(ptr-1)的值为5!

    三,杂项总结

    1,NULL表示为一个空指针其定义在stdio.h中,如下:#define NULL (void*) 0,空指针实际上代表0号内存单元,在所有系统中0号内存单元是不允许进行读写操作的,一次指向该内存的指针作为空指针之用。之所以定义为(void*)0,而不直接定义为0是为了避免编译器作无用的检查。


  • 相关阅读:
    CSS 定位position
    new Date(time).getTime()在ios返回NaN
    babel.js 文件 browser.min.js
    export 和 export default 的区别
    第一个webpack例子demo1
    Kafka源码解析与实战
    Redis实战
    RabbitMQ实战
    Spring源码理解
    Java并发编程实践
  • 原文地址:https://www.cnblogs.com/ymy124/p/2295227.html
Copyright © 2011-2022 走看看