四时宝库

程序员的知识宝库

面向过程底层开发技术《指针》(面向过程开发方法)

一、指针变量总结归纳比较

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");

}

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接