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 条评论
登录 后参与评论

相关文章

来自专栏IT可乐

Java数据结构和算法(三)——冒泡、选择、插入排序算法

  上一篇博客我们实现的数组结构是无序的,也就是纯粹按照插入顺序进行排列,那么如何进行元素排序,本篇博客我们介绍几种简单的排序算法。 1、冒泡排序   这个名词...

2198
来自专栏水击三千

浅谈JavaScript的字符串的replace方法

  JavaScript字符串提供了一个replace方法。replace方法可以接受两个参数:第一个参数可以使RegExp对象或者一个字符串,第二个参数可以是...

22510
来自专栏深度学习与计算机视觉

算法-字符串替换空格

题目: 实现一个函数,把字符串中的每一个空格替换成”%20”。例如输入”We are happy.”,则输出”We%20are%20happy.”。 解题思...

1796
来自专栏null的专栏

PHP基础——PHP数组

PHP数组与其他语言的数组有些不同,在PHP中,数组包含两种类型的数组: 数字索引数组 关联数组 其中,数字索引数组是指其key为数字,而后者可以使用字符串作为...

3286
来自专栏C# 编程

[C#]使用IFormattable接口来实现字符串格式化

本文为原创文章、源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称、作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:...

2350
来自专栏运维技术迷

连仕彤博客[Python笔记] 判断0-9数字在字符串中出现的次数

要求 给定一些数字(0-9范围之间),判断数字在字符串中出现的次数。 例子的排序是依照算法的效率(时间复杂度)从低到高 例子1   # 定义数字 num = ...

3947
来自专栏龙首琴剑庐

Java可变参数列表

1、接受的传入参数情况 如public void test(String ...args){...}  1)不使用参数,如test() 2)使用一个或多个参数,...

2947
来自专栏Python小屋

Python内置函数sorted()和列表方法sort()的排序原理

问题描述:在Python中,可以使用内置函数sorted()和列表方法sort()对数据进行排序,但要求所有数据支持关系运算符,也就是这些数据本身是可以比较大小...

2856
来自专栏开源优测

[快学Python3]if条件控制

if语句 先看下Python中一般的条件控制语句的形式是怎么样的,如下所示: if 条件: # 代码块 elif 条件: ...

1854
来自专栏运维技术迷

PHP-数组排序

分别定义一个数值数组和一个关联数组. $age=array("lili"=>"23","bob"=>"30","ben"=>"44"); $c...

2836

扫码关注云+社区