一、指针变量总结归纳比较
1、准确搞清楚指针的含义
指针就是地址,凡是出现“指针”的地方,都可以用“地址”代替。例如,变量的
指针就是变量的地址,指针变量就是地址变量。
2、要区别指针和指针变量
指针就是地址本身。指针变量是用来存放地址的变量。
例如,有人认为指针是类型名,指针的值是地址?类型是没有值的,只有变量
才有值,正确的说法是指针变量的值是一个地址。
3、什么叫“指向”
地址就意味着指向,因为通过地址能找到具有该 地址的对象。
值得大家注意:
并不是任何数据类型的地址都可以存放在指针变量中,只有和指针变量的基类型
相同的数据的地址才能存放在相应的指针变量当中。
例如:
int x,*px;
float y;
px=&x; // x是int型,合法
px=&y; // y是float型,类型不匹配
void *指针是一种特殊的指针,不指向任何类型的数据,如果需要用此地址
指向某类型的数据,应先对地址进行类型转换。
可在程序中进行显式的类型转换,也可以由编译系统自动进入隐式转换。
4、掌握对数组操作中正确使用指针
例如:一维数组名代表数组首元素的地址。
int *p,arr[10];
p=arr;
指针变量归纳总结
【变量定义】 【类型表示】 【含义】
int x; int 定义整型变量x
int *px; int * 定义px为指向整型数据的指针变量
int arr[10]; int [10] 定义整型数组arr,它有10个元素
int *px[5]; int *[5] 定义指针数组px,它由5个指向整型数据
的指针元素组成
int (*p)[5]; int (*)[5] p为指向包含5个元素的一维数组的指针变量
int Fun(); int () Fun为返回整型函数值的函数
int *p(); int *() p为返回一个指针的函数,该指针指向整型数据
int (*p)(); int (*)() p为指向函数的指针,该函数返回一个整型值
int **p; int ** p是一个指针变量,它指向一个指向
整型数据的指针变量
void *px; void * px是一个指针变量,基类型为void(空类型),
不指向具体的对象
5、指针运算
指针变量加(减)一个整数。
例如:px++,px-- p+i,p-i,p+=i,p-=i等均是指针变量加(整)一个整数。
该指针变量的原值(是一个地址)和它指向的变量所占用的存储单元的字节数相加(减)。
6、指针变量赋值
将一个变量地址赋给一个指针变量。
例如:
px=&a;
px=array;
px=&array[i];
px=max; // max为已定义的函数,将max的入口地址赋给p
px=py; // px和py是基类型相同指针变量,将py的值赋给px
注意事项:不应把一个整数赋给指针变量。
7、指针变量可以有空值
指针变量不指向任何变量。
例如:px=NULL;
其中NULL是一个符号常量,代表整数0。在头文件定义:
#define NULL 0
二、C编程动态内存分配及相关技术
1、什么是内存的动态分配
全局变量是分配在内存中的静态存储区的,非静态的局部变量是分配在内存中的
动态存储区,这个存储区是一个称为栈(stack)区。
除此以外,C语言允许建立内存动态分配区域,以存放一些临时用的数据。自由存储
区,称为堆(heap)区。
2、怎么建立内存的动态分配
对内存动态分配是通过系统提供的库函数来实现,主要有:calloc,free,malloc,realloc。
A.使用malloc函数
函数原型:void *malloc(unsigned int size);
函数作用:在内存的动态存储区中分配一个长度为size的连续空间。
注意:size不允许为负数。
例如:malloc(10000); // 临时分配域,不指向任何类型的数据,只提供一个地址。
B.使用calloc函数
函数原型:void *calloc(unsigned n,unsigned size);
函数作用:在内存的动态存储区中分配n个长度为size的连续空间,这个空间一般是比较
大,足够保存一个数组。
例如:px=calloc(20,4); // 开辟20*4个字节的临时分配域
C.使用free函数
函数原型:void free(void *p);
函数作用:释放指针变量p所指向的动态空间,使这部分空间能重新被其它变量使用。
例如:free(p); // 释放指针变量p所指向的已经分配的动态空间
D.使用realloc函数
函数原型:void *realloc(void *p,unsigned int size);
函数作用:如果已经通过malloc函数或calloc函数获得动态空间,想改变其大小,可以用
realloc函数重新分配。
例如:realloc(p,50); // 将p所指向的已经分配的动态空间改为50字节
3、void指针类型
注意:不要把“指向void类型”理解为能指向“任何的类型”的数据,而应理解为“指向空
类型”或“不指向确定的类型”的数据。
例如:
int a=10000; // 定义a为整型变量,且赋初值为10000
int *px=&a; // px指向int型变量
char *py;
void *pz;
pz=(void *)px;
py=(char *)pz;
pz=&a; // 不可以
工程实战案例:
编程建立动态数组,输入10个同学的成绩,另外用一个函数检查其中有无低于80分的,
输出不合格的成绩。(课堂作业 10分钟)21:39---21:49
源代码:
// PTestssH.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
// 声明函数检查有无低于80分
void CheckLE(int *);
int _tmain(int argc, _TCHAR* argv[])
{
int *pm, i;
pm = (int *)malloc(10 * sizeof(int));
for (i = 0; i < 10; i++)
scanf_s("%d", pm + i);
CheckLE(pm);
return 0;
}
void CheckLE(int *px)
{
int i;
printf("低于80分如下:");
for (i = 0; i < 10; i++)
if (px[i] < 80)
printf("%4d",px[i]);
printf("\n");
}