2017.11.14 C语言---指针的学习
第八章 善于利用指针
(1)指针是什么
1.内存区每一个字节都有一个编号,这就是“地址”。地址形象化的被称为“指针”。它能通过以它为地址的内存单元。地址指向(*)该 变量单元。指向就是通过地址来体现。【指针是一个地址,指针变量是存放地址的变量】
2.在程序中一般是通过变量名来引用变量的值,这种直接通过变量名进行访问的称为直接访问;
间接访问:将变量 i的地址存放在另一变量中,然后通过该变量来找到变量i的地址从而访问i变量。
@
(2)指针变量
使用指针变量的地址
例题1://通过指针变量访问整型变量
#include<stdio.h>
int main()
{
int a=100;
int b=10; //定义a、b整型变量,并初始化
int *pointer_1; //定义指向整型数据的指针变量pointer_1
//*pointer_1表示指针变量pointer_1所指向的变量,也就是变量a 100
int *pointer_2; //定义指向整型数据的指针变量pointer_2
pointer_1=&a; //把变量a的地址赋给指针变量pointer_1,
pointer_2=&b; //把变量b的地址赋给pointer_2
printf("a=%d,b=%d\n",a,b);
printf("*pointer_1=%d,*pointer_2=%d\n",*pointer_1,*pointer_2);
return 0;
}
怎样定义指针变量
定义指针变量额一般形式:**类型名 * 指针变量名 ** ,指针变量是基本数据类型派生出来的类型,它不能离开基本类型而独立存在
@ 例如: int pointer_1,pointer_2;
@
在定义指针变量时,同时对它初始化。
例如: int *pointer_1=&a;,*pointer_2=&b;
//指针变量前面的*表示该变量类型为指针变量。指针变量名为pointer_1 and pointer_2
//不能写成“*pointer_1=&a; and *pointer_2=&b;”a的地址是赋给pointer_1
一个变量的指针的含义包括两个方面:一是以存储单元编号表示的地址(如编号为2000),一是它指向的存储单元的数据类型,说明变量类型时应该是这样说:a是指向整型数据的额指针变量,b是指向单精度数据类型的指针变量。
@【指向整型数据的指针类型表示为 int ,读作“指向int 的指针”或者简称 “int指针”】
@【指针变量不能存放地址(指针)不要将一个整数赋值给指针变量, 例如:pointer_1=10000;】
两个有关运算符: & 取地址运算符 &a是变量a的地址
* 指针运算符 *p代表指针变量p指向的对象
怎样运用指针
在引用指针时有三种情况
1.给指针变量赋值; 例如:p=&a;//把a的地址赋给指针变量p;;;;int * 读作int指针
2.引用指针变量指向变量; 例如:已执行p=&a; printf("%d",*p); //a指向整型数据的指针变量
3.引用指针变量的值; 例如: printf("%o",p);
例题2://输入ab两个整数,按先大后小的顺序输出a和b
#include<stdio.h>
int main()
{
//int *p1;
//int *p2;//p1,p2的类型是int *型
int *p;
int a;
int b;
printf("please enter two integer numbers:");
scanf("%d,%d",&a,&b);
int *p1=&a; //使p1指向变量a
int *p2=&b; //使p2指向变量b
if(a<b)
{
p=p1;
p1=p2;
p2=p;//p1 p2互换值 //换成p1=&b;p2=&a;
}
printf("a=%d,b=%d\n",a,b);
printf("max=%d,min=%d\n",*p1,*p2);
return 0;
}
//a和b的值并未交换,它们仍保持原值,但p1和p2的值改变了,p1的值原为&a,后来变成了&b
指针变量作为函数参数
例题2://对输入的两个整数大小按大小顺序输出。先用函数处理而且用指针类型的数据作函数参数。
#include<stdio.h>
int main()
{
void swap(int *p1,int *p2);//声明swap函数
int a;
int b;
int * pointer_1;
int * pointer_2;//定义两个指针变量
printf("please enter a and b:");
scanf("%d,%d",&a,&b);
pointer_1=&a; //pointer1指向a
pointer_2=&b; //pointer2指向b
if(a<b)
swap(pointer_1,pointer_2);//如果a大于b调用swap函数
printf("max=%d,min=%d\n",pointer_1,pointer_2);
return 0;
}
swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
(3)通过指针引用数组
1.数组元素的指针
@一个变量有地址,一个数组包含若干个元素,每个数组元素都在内存中占用存储单元,它们都应有相应的地址。所谓数组元素的指针就是数组元素的地址。
1可以用一个指针变量指向一个数组元素。引用数组元素可以用下标法也可以用指针法(好)
例如:
int a[5]={1,23,56,9,8};//定义a为包含5个整型数据的数组
int *p; //定义p为指向整型变量的指针变量
int *p=&a[2];// p=&a[0]; //把a[0]的地址赋给指针变量p,p=1.
2.在C语言中数组名(不包括形参数组名,形参数组并不占用实际的内存单元)代表数组中的首个元素。数组名不代表整个数组,只代表数组首元素的地址。
例如:p=&a[0];p的值是a[0]的地址
p=a;//p的值是数组a首元素
2.在引用数组元素时指针的运算
指针就是地址。在一定条件下允许对指针进行加和减的操作运算。
在指针指向数组元素时,可以对指针进行以下操作:
加/减一个整数(+或+=),例如:p+1;p-1
自加自减,例如:p++/p--
两个指针相减,例如:p1-p2(p1和p2指向同一数组中的元素有效)
分别说明如下:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。注意:执行p+1时并不是将p的值简单地加一而是加上一个数组元素所占用的字节数。
例如:数组元素是float型,每个元素占用四个字节,则p+1意味着使p的值加4个字节(实际上是p+1*d)d是一个数组元素所占的字节数
对int型 每个元素占用4个字节;char型是一个元素为一个字节;float和double每个元素占用4个字节
(5)通过指针引用数组元素
引用一个数组元素可以用两种方法:下标法,例如a[i] ;指针法:(a+i) 或者 。(p+i)。其中a是数组名,p是指向数组元素的指针变量,其初值为p=a
2017.11.14 C语言---指针的学习的更多相关文章
- 11-C语言指针&一维数组&字符串
一.用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3 4 int i; 5 for (i = ...
- C语言 ---- 指针 iOS学习-----细碎知识点总结
内存的访问形式:1.直接访问:通过变量名进行访问.2.间接访问:先找到变量存放的地址,然后根据地址去访问对应的内存空间. 指针--- // 定义一个整形指针变量,用来存储num1在内存中的地址 ...
- 团队作业4——第一次项目冲刺(Alpha版本)2017.11.14
1.当天站立式会议照片 本次会议在5号公寓1楼召开,本次会议内容:①:熟悉每个人想做的模块.②:根据老师的要求将项目划分成一系列小任务.③:选择项目的开发模式:jsp+servlet+javabean ...
- #UnityTips# 2017.11.14
hi,all.最近比较忙,所以更新也比较慢了. 今天就来和大家分享一个小Tip,它是关于UGUI的坑的. 使用过UGUI的朋友们都知道,Canvas的渲染方式有三种: Screen Space Ove ...
- 团队作业4——第一次项目冲刺(Alpha版本)2017.11.14
第一次会议:2017-11-14 额--这几天比较忙,忘记上传了,今天补上 先上个图,O(∩_∩)O哈哈: 会议主要内容: 1. 讨论整体框架 2. 个人具体分工 3. 代码统一 具体分工: 成员 计 ...
- 2017.11.19 C语言基础及流水灯实现
/* 从右往左*/ #include <reg52.h> sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADD ...
- 第一次项目冲刺(Alpha版本)2017/11/14
一.站立式会议 在宿舍进行了第一次会议 会议内容: 1.做了简单的分工 2.提出个人对任务是否有困难 3.规定完成时间在第三天之前 4.商量初步的代码规范 二.分工 三.任务分解图 四.燃尽图 五.数 ...
- 2017.11.18 C语言的算法分析题目
算法分析 1. 选定实验题目,仔细阅读实验要求,设计好输入输出,按照分治法的思想构思算法,选取合适的存储结构实现应用的操作. 2. 设计的结果应在Visual C++ 实验环境下实现并进行调试.(也可 ...
- 第26次Scrum会议(11/14)【欢迎来怼】
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/14 11:35~11:57,总计22min.地点:东北 ...
随机推荐
- (转)Caffe搭建:常见问题解决办法和ubuntu使用中遇到问题(持续更新)
参考网址:http://www.cnblogs.com/empty16/p/4828476.html 严正声明: 在linux下面使用命令行操作时,一定要懂得命令行的意思,然后再执行,要不然在不知道接 ...
- Linux防火墙配置学习记录
一.iptables基本原理 1.iptables是一个管理内核包过滤的工具,包含4个表,5个链 表和链被称为Netfilter模块的两个维度, 表提供特定的功能内置四个表: filter表:用于对数 ...
- 使用Koa.js,离不开这十个中间件
随着ES6的普及,async/await的语法受到更多JS开发者的青睐,Koa.js作为比较早支持使用该语法的Node框架越来越受到大家的喜爱,虽然Koa.js本身支持的功能很有限,但官方和社区提供了 ...
- 为什么我用gets不行呢?系统无视了我的存在!!!
梗概:为什么我用gets不行呢?系统无视了我的存在!!!我还没输入东东啊..怎么就提示[请安任意键继续]的?? 原来是缓冲区的问题啊? 一.什么是缓冲区 缓冲区又称为缓存,它是内存空间的一部分.也就是 ...
- Unity Screen Screen.SetResolution 设置分辨率
Screen.SetResolution 设置分辨率 C# => public static void SetResolution(int width, int height, bool ful ...
- linux信号的处理--部分源码分析
基于linux master v4.9版本 信号是异步的, 一.信号何时来 信号是异步的,对于一个进程随时都会接收到信号. 二.选择线程(task)来处理 那么一个进程接收到信号时,需要选择一个tas ...
- Tips In C
C语言中的使用操作 宏定义时使用do while防止语句的分离, 但是不使用与需要有返回值的语句, 这个时候可以参考第二条 宏定义时使用({}), ()加上{}的方式, 在代码中填写逻辑算法, 最后的 ...
- Hive总结
一.什么是Hive 1.Hive 由 Facebook 实现并开源 2.是基于 Hadoop 的一个数据仓库 3.可以将结构化的数据映射为一张数据库表 4.并提供 HQL(Hive SQL)查询功能 ...
- MongoDB之mongodb.cnf配置
# mongodb3.2.1 的主配置文件,将此文件放置于 mongodb3.2.1/bin 目录下 # hapday 2016-01-27-16:55 start # 数据文件存放目录 dbpath ...
- CAD鼠标移动到对象时显示对象内容
//定义事件 Editor ed = doc.Editor; ed.PointMonitor += new PointMonitorEventHandler(ed_Po ...