指针和动态内存

A.指针的大小比较

   例子:

#include<stdio.h>

#include<conio.h>

void main(void)

{

       intsz[9]={1,2,3,4,5,6,7,8,9};

       int* p=&sz[0];

       for(p=&sz[0];p<&sz[8];p++)

       {

              printf("%d",*p); //1 2 3 4 5 6 7 8

       }

}

注:编辑器并不指明指针越界的错误,推荐:在for循环结束后,使用语句将指针p置空:p=NULL

 

B. 指针表达式与左值

指针变量以及指针变量的间接引用都可以作为左值

如:

intnum1=0,num2=0;

int*p=&num1;

p=&num2;   //指针作左值

*p=1;       //间接引用作左值

注:指针变量可以做左值,并不是因为其是指针,而是因为是变量

 

C. 指针与const

const:即constant——“恒定、不变”的意思;

nt* x=0;   int* consta=&x;

const修饰变量或函数的参数列表及返回值,限定其不允许被改变

即:

(1)禁止对指针赋值;

(2)禁止通过间接引用(*指针)对指针所指的变量赋值;

(3)既禁止对指针赋值,又禁止通过间接引用(*指针)对指针所指的变量赋值;

 

D. 动态内存分配

mallocfree函数:允许动态申请所需要的内存;

声明数组,必须明确告诉编辑器数组的大小,为其开辟固定大小的内存,这种分配机制称为静态分配;(在执行前就指定

动态分配:指用户可以在程序运行期间根据需要申请或释放内存,大小也完全可控。(执行程序时分配,使用完毕回收

malloc函数:

形式:    void *malloc(unsigned intsize);

参数size是个无符号整型数,用户由此控制申请内存的大小,执行成功时,系统会为程序开辟一块大小为size个内存字节的区域,并将该区域的首地址返回,用完回收,若申请失败(如内存不够用),返回空指针NULL。

如:int* p=(int*) malloc(5*sizeof(int));

系统将开辟一块能存储5个int数据的内存,并用首地址为刚声明创建的int型指针p初始化,如果失败,p将初始化为NULL。一般以上开辟内存大小为20;

例子:

       int * p=(int*) nalloc(5* sizaof(int))

       if(p==NULL)

{

       ……    //内存申请出错应对措施

}

Else

{

       ……     //申请成功时操作

}

  free函数:

当动态申请的内存使用完毕,需要归还,称为“释放”,调用free函数;

形式:void free(void* p);

其中,p是指向所申请内存块的指针,系统可以完成由其他类型指针向void型指针的转化,因此直接使用“free(指针);”就可以实现内存的释放。

 

例子:

#include<stdio.h>

#include<conio.h>

void main(void)

{//声明一int型指针p,并申请一块动态内存,用其首地址为p初始化

       int *p=(int*)malloc(10*sizeof(int));

       int i=0;    //声明一循环控制变量

       if(p==NULL) //防错处理,看内存申请释放成功

       {

              printf("内存申请失败,退出");

              return;

       }

       for(i=0;i<10;i++)

       {

              *(p+i)=i;  //对该块内存每个int单元赋值

       }

       for(i=0;i<10;i++)

       {

              printf("%d ",*(p+i));

       }

       free(p);  //释放内存

       getch();

}

//结果:0 1 2 3 4 5 6 7 8 9

动态申请一块可存放10个int型单元的内存,通过强制类型转换将该内存的首地址赋给了int型指针p;在赋值和显示时,采用了“*(p+i);”来间接访问内存,而不是“p++”的形式,避免对p的修改,这是为了后边释放内存的需要。

Free函数与指针

例子:

#include<stdio.h>

#include<conio.h>

void main(void)

{//声明一int型指针p,并申请一块动态内存,用其首地址为p初始化

       int *p=(int*)malloc(10*sizeof(int));

       int i=0;    //声明一循环控制变量

       if(p==NULL) //防错处理,看内存申请释放成功

       {

              printf("内存申请失败,退出");

              return;

       }

       printf("p的值是%p\n",p);  //输出p的值

       free(p);                  //释放动态内存

    printf("p的值是%p\n",p);  //输出p的值

       getch();        

}

//结果:p的值是003F0F08

//      p的值是003F0F08

释放动态内存,并不意味着指针会消亡,也不意味指针的值会改变

 

calloc函数:(与malloc一样)

形式: void* calloc(size_t num, size_t size);

calloc( )函数返回类型也是void*,需要强制转换才能为其他类型的指针赋值,calloc需要两个参数以指定申请内存块的大小,一是对象占据的内存字节数size,二是对象的个数num。

calloc申请的内存也是通过free函数释放,

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值