C语言编程精华--《指针》
使用指针有两方面的优势:
1、用指针能够更好完成某些任务;
2、有些任务只能是用指针才能够完成。
一、指针定义
1、计算机的内存
计算机的内存(RAM)由数百万个或千万个顺序存储位置组成(具体有多少个存储位置是由内存容量决定),每个内存位置都有唯一的地址。计算机内存地址范围从0开始到最大值(取决于内存的数量)。
例如:int x=360;
当程序使用该变量名时,将自动访问正确的内存位置。虽然程序使用了该位置的地址,但是对我们用户来讲它是隐藏,你也不需要关心这个问题。
2、如何创建指针
注意:x变量或任何其他变量的地址都是一个数字(类似于C语言的其他数字)。假设大家知识一个变量的地址,我们应该如何去创建第2个变量来存储第一个变量的地址。
int x=360;
第一步:先声明一个变量存储x变量的地址。
int *p_x=NULL;
第二步:把x变量的地址存储到p_x变量中。
p_x=&x;
工程案例:
// PointerTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#define P_NULL NULL
int _tmain(int argc, _TCHAR* argv[])
{
int x = 360; // 声明变量x,且初始化值360
printf("x的地址:%d ",&x);
int *p_x = P_NULL;
printf("p_x的值:%d ",p_x);
p_x=&x;
return 0;
}
3、声明指针
指针是一个数值变量,和所有变量类似,必须先声明后使用。指针变量和普通变量命名规则基本相同,而且指针变量名必须唯一。大家只要按照遵循C语言的命名规范,就可以任意命名。
int *p_Man; // 没有结婚之前
const // 结婚
指针的声明形式:
类型名 *指针名;
类型名可以是任意C语言的变量类型,它指明该指针指向变量的类型。星号(*)间接运算符,表明指针名是一个指向类型名类型的指针,不是类型名类型的变量。
例如:
char *c1,*c2; // c1,c2都是指向char类型的指针
double *v1,v2; // v1是指向double类型变量的指针,v2是普通的double类型变量
注意:
*号可用作间接运算符和乘法运算符。
4、初始化指针
没有存储变量地址的指针是没用的。变量的地址不会自动(变)进指针中,必须在程序使用取地址运算符(&)获得变量的地址,然后将其存入指针当中才可以。把取地址运算符放在变量名前,便会该变量的地址。
初始化指针:
指针 = &变量;
v1=&v2;
5、使用指针
现在大家学会声明和初始化指针之后,如何使用指针,又要用到间接运算符(*)。把*放在指针名前,该 指针引用它所指向的变量。
实例:
// PointerTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#define P_NULL NULL
int _tmain(int argc, _TCHAR* argv[])
{
int x = 360; // 声明变量x,且初始化值360
printf("x的地址:%d ",&x);
int *p_x = P_NULL;
printf("p_x的值:%d ",p_x);
p_x=&x;
// 输出时加*号,指的是p_x指针变量指向x变量的地址里面的值360
printf("p_x存储x地址里面的值:%d ",*p_x);
return 0;
}
二、指针用途
1、指针和数组
A、数组名
数组名(不带方括号)是指向数组第一个元素(即,首元素)的指针。比如你声明一个数组int a[];那么a中存储的是数组第1个元素的地址。
案例:
// ArrSoft.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
int _tmain(int argc, _TCHAR* argv[])
{
double a[20];
// 数组下标从0开始 ,数组就是首地址,数组存储空间是连续,数组存储是同类型数据
for (int i = 0; i
{
printf("数组a[%2d]的地址为:%d ",i,&a[i]);
}
return 0;
}
B、存储数组元素(暂时不讲)
C、指针算术(指针递增、指针递减)(暂时不讲,同学们的要求)
三、如何将指针应用到(数组、函数、结构体、链表等)(暂时不讲,同学们的要求)
1、C编程内存越界和内存监测技术
按照刚才图形结构设计思路,首选要你要构建一个接口文件:Interface.h
四、工程案例(计算机内存监控系统)
领取专属 10元无门槛券
私享最新 技术干货