题注:正确理解和运用指针是衡量是否成功地运用C语言编程的标准
A:在函数调用过程中,运用指针可以十分灵活地修改函数中被调用的参量;
B:指针可以用来支持C语言动态分配程序;
C:可以提高某些程序的效率。
(1):指针是地址
把指针仅仅看成是内存中的一个地址,第一个变量可以说成是指向第二个变量;
(2):指针变量
【形式】:【类型 * 变量】定义指针可以指向的变量类型;
【注】:如果一个变量包括指针,必须对它进行说明。
(3):指针运算符【*】【&】
【*】:表示返回指针指向地址中变量的值;
【&】:表示返回指针变量的内存地址。
【注】:【*】与乘法运算符、【&】与位运算符相同,注意优先级关系,都比算术运算符的高,与一目减相同;指针变量必须指向正确的数据类型。
(4):指针表达式【特殊性】
【1】指针的赋值
int x,*p1,*p2;
p1=&x;
p2=p1;
【2】指针的算术运算 【只有两种:加和减】
p--;p++;--p;++p;p=p-9;运算后结果是内存地址,所有指针都按照它所指向的数据类型的字节长度进行加和减,总是指向基本类型的相应元素。
不能进行其它运算:因为指针通常是以动态分配来确定的,在内存中是随机的,不是一个确定的值。
【3】指针的比较
应用背景:常用于两个或两个以上的指针都指向同一个公共对象时;
例如:建立一个堆栈存储整型量的值,堆栈是一张“先进后出”存储表。
#include "stdib.h"
int *p1*p2;
main()
{
int vlue;
p1=(int *)malloc(50*sizef(int));
if(!p1)
{
printf("allocation failure\n");
return;
}
p2=p1;
do{
scanf("%d",&vlue);
if(vlue!=0)
push(vlue);
else printf("this is it %d\n",pop());
}while(vlue!-1);
push(int i)
{
p1++;
if(p1==(p2+50))
{
printf("stack overflow);
exit(1);
}
*p1=i;
}
pop()
{
if(p1==p2)
{
printf("stack underflow);
exit(1);
}
p1--;
return *(p1+1);//括号是必不可少的
}
}
(5):动态分配函数【给堆栈分配或释放空间】"stdib.h"
【maloc】:分配内存并返回一个指向这个内存的字符型指针;必须有足够的剩余空间才可以分配;【void *malloc(num_bytes)】
【注】必须定义它的类型,以便指针转换成正确的类型;
char *p; p=(char *)malloc(1000);//p指向1000个字节的空余内存的首地址;
int *p; p=(int *)malloc(50 *sizeof(int));//使用sizeof来确定整型量所需要的字节长度。
由于堆的范围是有限的,因此当你分配内存时一定要检查由malloc所返回的值以保证在使用指针前,它的内存不为0;
if(!p=malloc(100))
{
printf("out memory.\n");
exit(1);
}
【free】: 释放原先所分配的内存,使它能重新分配;对象必须是事先分配过、有效的指针。【free(void *p)】
文章评论(0条评论)
登录后参与讨论