C-学习笔记9-指针与指针、指针与内存动态分配

一.指向指针的指针

      如果一个指针指向的是另一个指针变量的地址,称这个指针是指向指针变量的指针。通过指针访问变量成为间接访问,通过指针的指针变量来访问变量则构成了“二级间接地址”。定义形式为:

      数据类型   **p;

      例如:

int a,*p=&a,**pp=&p;

       指向二维数组的指针就是一个指向指针的指针。

#include<stdio.h>

int main()
{
   char *name[]={"Fotran","BASIC","Pascal","FORTRAN","Computer Design"};
   char **p;
   int i;
   for(i=0;i<5;i++)
   {
      p = name+i;
      printf("%s\n",*p);
   }
   return 0;
}

       注意:

              1.用到多级间接引用时,几个*就是几个间接引用。

              2.同类型的同等级的指针才能相互赋值。

              3.通过多级间接指针变量对最终对象赋值的时候,也必须采用相应个数的间接运算符*。

二.指针与动态内存分配

      在C语言中,数组和结构的大小必须是固定的,但很多时候我们不知道数组的大小,当数组不够大的时候,就会引起下标越界的异常。C语言提供了动态分配内存的手段来解决这一问题。

      动态内存分配相对于静态内存分配需要预先分配内存,根据程序的需要进行扩大或缩小。

      要实现动态分配内存需要的函数在标准头文件<stdlib.h>中描述,因此需要#include<stdlib.h>

      1.malloc函数

               void * malloc(unsigned int size)

               该函数的作用是在内存的动态储存区中分配一个长度为size的连续空间。其参数是一个无符号整型数,返回值是一个指向所分配的连续存储域的起始地址的指针。必须注意的是,当函数未能成功分配储存空间(内存不足),就会返回一个null指针。所以调用时应该检测是否返回值为NULL

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int count,*array;
    if((array=(*int)malloc(10*sizeof(int)))==NULL)
    {
       printf("未能成功分配内存");
       exit(1);
    }
    for(count=0;count<10;count++)
    {
       array[count]=count;
    }
    return 0;
}    
#include<stdio.h>
#include<stdlib.h>
char count,*ptr,*p;

int main()
{
    ptr = (*char)malloc(30*sizeof(char));
    if(ptr==NULL)
    {
       puts("Memory Allocation Error");
       return 1;
    }
    p = ptr;
    for(count = 65;count<91;count++)
    {
        *p++ = count;
    }
    *p = "\0"
    puts(ptr);
    return 0;
}

        2. calloc函数

            calloc函数不是以字节为单位,而是以对象为单位,对象可以是数组、结构等。

            * calloc(size_t num,size_t size)   num表示要分配的对象个数,size表示每个对象占用内存单元的字节数

       3.free函数

            由于内存单元是有限的,有些内存单元不用时就要释放掉。

            void free(void *ptr)

            作用是释放掉ptr指针所指向的内存区。参数ptr必须是malloc函数或calloc函数调用过的指针,否则会造成死机或者其他后果。

       注意:

            1.空间大小计算要用sizeof函数

            2.调用malloc函数后一定要检查返回值

            3.结果强制转换后才能使用

            4.得到的空间使用时不能越界

            5.系统不会检查关于存储块的管理

            6.动态存储块的存在期,在其分配成功时开始,只有在free语句释放后才为其结束

猜你喜欢

转载自blog.csdn.net/Kayaobi/article/details/83177944