C语言编程精华——《指针》

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

四、工程案例(计算机内存监控系统)

本文来自企鹅号 - 程序员港湾媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏三流程序员的挣扎

Python 自学二——类型

', '.join(['cats', 'rats', 'bats']) # 以 `, ` 分隔 'cats, rats, bats' s = 'cat ra...

763
来自专栏C语言及其他语言

结构体与共用体

1、结构体的定义和使用 前面我们已经讨论过字符数组与字符串,字符指针也可以指向一个字符串,可以用字符串常量对字符 指针进行初始化。例如: char *str...

3117
来自专栏工科狗和生物喵

【计算机本科补全计划】Java学习笔记(四) 修饰符

正文之前 今天总算是把那个党员谈话给弄完了,三个学弟轮番跟我来聊天,讲自己的入党动机啥的,看到他们就仿佛看到了大一的自己,原来当时面对学长,面对这类事情,会紧张...

3179
来自专栏CodingToDie

Python学习(四):dict,set和关键字

第4 章 dict,set和关键字 Table of Contents dict set 再谈遍历 标识符(Identifiers) 关键字 判断、循环 函数、...

3264
来自专栏用户2442861的专栏

Python yield 使用浅析

您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ?

571
来自专栏用户2442861的专栏

C/C++求职宝典21个重点笔记(常考笔试面试点)

http://blog.csdn.net/lanxuezaipiao/article/details/41557307

331
来自专栏向治洪

Java泛型和通配符那点事

泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数...

1995
来自专栏Java学习网

开发中最常见的Java字符串问题总结

开发中最常见的Java字符串问题总结  1.怎样比较字符串?用”==”还是用equals()?   简单地说,”==”测试两个字符串的引用是否相同,equals...

21310
来自专栏Java架构师学习

为Java程序员金三银四精心挑选的五十道面试题与答案

1、面向对象的特征有哪些方面? 【基础】 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地...

3396
来自专栏文武兼修ing——机器学习与IC设计

JavaScript入门笔记(2)字符串相关列表对象

字符串相关 字符串基础 字符串历来是各种编程语言坑最多的地方(个人认为),不同软件语言在字符串上的操作的差别比软件语言和硬件描述语言的差距都大(一样是个人认为)...

2926

扫码关注云+社区