上一次修改时间:2015-11-23 21:21:36

c语言指针

  1. 定义

    1)指针就是地址,地址就是指针;

    2)指针变量就是存放内存单元地址的变量;

    3)指针本质是一个操作受限的非负整数,操作受限为指针不象普通的非负整数一样进行运算;指针不能加,乘,除,只能在某些情况下进行相减;

  2. c指针代码示例

  3.   # include <stdio.h>
                
      int main(void)
      {         
          int i = 1;
          int j;                                                                                                                         
          int * p= &i;    //此处等价于int *p; p=&i;定义了一个指针变量p,p只是一个变更的名字,int * 表示变量p只能存储int型的指针数据      
                
          j = *p;  //此处,等价于j = i,因此*p也等价于*p=i;
          printf("i=%d, j=%d, p=%d\n", i,j,*p);
      }
  4. # include <stdio.h>   
                  
    void f(int * p)//此处是定义了一个名叫p的形参,且p的类型为int *
    {            
        *p = 100;                                                                            
    }            

    int main(void)
    {            
        int i = 9;
                
        f(&i);   
                
        printf("i=%d\n", i);

        return 0;
     } 

  5. 一维数组与指针的关系

    1)一维数组名是个指针常量;

    2)存放的是第一个元素的地址,且该量不能被改变

    3)下标与指针的关系:a[i] 等价于 *(a+i)

    4)c中数组在内存中的存放物理地址是连续的;

  6. 一维数组代码示例:


  7. # include <stdio.h>           
                                  
    int main(void)                
    {                             
        int a[5] = {1,2,3,4,5};   
                                   
        *(3+a) = 40;              
        4[a] = 50;                
                                    
        printf("%d,%d\n", a[3],a[4]); 
        printf("%p\n", a+1);//此处为输出a[1]的地址,p%是以16进制输出
        printf("%p\n", a+2);
        printf("%p\n", a+3);
        printf("%d\n", *a+3);   //此处*a+3等价于a[0]+3                      
    }
  8. [pikaqiu@localhost c]$ gcc -o test1 test.c
    [pikaqiu@localhost c]$ ./test1
    40,50
    0x7fff13f3ef54
    0x7fff13f3ef58
    0x7fff13f3ef5c
    4
  9. 无论指针变量指向哪里,指针变量本身都只占4个字节;

  10. malloc函数动态分配内存的时候,只会返回所请求空间(如请求20个字节)的第一个字节的地址;

  11. 静态定义的数组除非程序终止,否则会一直占用内存,而动态分配的数组可以在程序执行过程中随机释放;

  12. # include <stdio.h>
    # include <malloc.h>
            
    int main(void)
    {       
        int a[5] = {1,2,3,4,5};
            
        int len;
        printf("请输入你需要分配的数组的长度:len = ");
        scanf("%d", &len);
        //动态定义数组
        //malloc函数返回是动所请求空间(如请求20个字节)的第一个字节的地址(干地址)
        //所以malloc函数前面必须将其强制转换为具体的数据类型,才能通过*(a+n)的方式找到后面的元素
        //sizeof返回的是int数据所占的字节数
        int * pArr = (int *)malloc(sizeof(int) * len);
            
        int i;                                                                                   
        for (i=0; i<len; ++i)
            scanf("%d",&pArr[i] );
            
        for (i=0; i<len; ++i)
            printf("%d\n", *(pArr+i));
            
        free(pArr);
    }
  13. [pikaqiu@bogon c]$ gcc -o test test.c         
    [pikaqiu@bogon c]$ test
    [pikaqiu@bogon c]$ ./test
    请输入你需要分配的数组的长度:len = 5
    1 2 3 4 5
    1
    2
    3
    4
    5
  14. malloc函数分配的内存必须手动用free释放,如是在某个函数内部分配的内存空间,该函数执行完毕后,该内存依然存在,但当整个程序执行完毕后,该内存会被回收;

  15. #include <stdio.h> 
    #include <malloc.h>                                                                          
    //跨函数使用内存示例
    int f(int  **q)       
    {                     
        *q = (int *)malloc(4);
    }                     
    int main(void)        
    {                     
        int *p;           
        f(&p);            
    }
  16. malloc动态分配内存分配失败时会返回NULL,因此使用该函数分配内存时,一定要判断返回值是否为空;