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. 动态内存分配
malloc和free函数:允许动态申请所需要的内存;
声明数组,必须明确告诉编辑器数组的大小,为其开辟固定大小的内存,这种分配机制称为静态分配;(在执行前就指定)
动态分配:指用户可以在程序运行期间根据需要申请或释放内存,大小也完全可控。(执行程序时分配,使用完毕回收)
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函数释放,