《C语言程序设计(第四版)》阅读心得(三)
第八章 指针
1、一个变量的地址称为该变量的指针
一个专门用来存放另一变量的地址(即指针),称它为指针变量。指针变量的值是指针(即地址)
如上图2000是变量的指针,pointer是指针变量, 赋值语句可以为 *pointer = 3; *表示指向,*pointer表示指针变量pointer指向的变量
2、指针变量的定义 类型名 *指针变量名;
& 取地址运算符 &a是变量a的地址;
* 指针运算符 *p代表指针变量p指向的对象
#include<stdio.h>
int main()
{
int a=,b=;
int *pointer1, *pointer2;
pointer1 = &a; //注意不是 *pointer1 = &a,这里的指针变量名是pointer1
pointer2 = &b;
*pointer2 = ;
printf("a=%d,b=%d\n",a,b);
printf("*pointer1=%d,*pointer2=%d",*pointer1,*pointer2);
return ;
}
3、指针变量作为函数参数
int main()
{
int a,b;
int *pointer1,*pointer2;
scanf("%d%d",&a,&b);
pointer1 = &a;
pointer2 = &b;
if( a<b ) Swap1( pointer1,pointer2);
printf("max=%d min=%d",a,b);
return ;
}
下面看一下回字的四种写法
void Swap1( int *p1, int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
这种写法是可以完成交换的,把p1指向的内容交换,也就是a和b的值交换了
void Swap2( int *p1, int *p2)
{
int *temp;
temp = p1;
p1 = p2;
p2 = temp;
}
这种做法的意思是把指针变量的值进行交换,但是这是办不到的。因为C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。
不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值。
void Swap3( int *p1, int *p2)
{
int *temp;
*temp = *p1;
*p1 = *p2;
*p2 = *temp;
}
这种做法更加就不靠谱一点,*p1就是a,是整型变量, *temp是指针变量temp所指向的变量,但由于未给temp赋值,因此temp中并无确定的值,所以temp所指向的单元也是不可预见的,所以,对*temp赋值就是向一个未知的存储单元赋值,而这个未知的存储单元中可能存储着一个有用的数据,这样就有可能破坏系统的正常工作情况。
void Swap4( int a, int b)
{
int temp;
temp = x;
x = y;
y = temp;
}
这个就是比较明显的形参值的改变不能使实参值随之改变,x与y的值交换了,但是a与b的值并未受到影响
4、通过指针引用一维数组
1)在C语言中,数组名(不括形参数组,形参数组不占据实际的内存空间)代表数组中首元素(即序号为0的元素)的地址
int *p;
p = &a[];
p = a; //以上两句等价
2)如果指针变量p已经指向数组中的一个元素,那么p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。
3)如果p的初值为&a[0],那么p+i和a+i就是数组元素a[i]的地址,*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]
4)设p指向数组a的首元素(p=a)
p++;
*p;
//p++使p指向a[1],再执行*p得到a[1]的值 *p++;
//等价于*(p++);相当于a[i++]
//先引用p的值,实现*p的运算,得到a[0],再自增 *(++p);
//相当于a[++i]
//先p自增,再运算得到a[1] ++(*p);
//相当于 ++a[0];
5、通过指针引用多维数组
设一个二维数组 int a[3][4]={ {1,3,5,7},{9,11,13,15},{17,19,21,23} };
表示形式 |
含义 |
地址 |
a |
二维数组名,指向一维数组a[0],即0行的首地址 |
2000 |
a+1 ,&a[1] |
1行首地址 |
2016 |
a[1],*(a+1) |
1行0列元素a[1][0]的地址 |
2016 |
a[1]+2,*(a+1)+2,&a[1][2] |
1行2列元素a[1][2]的地址 |
2024 |
*(a[1]+2),*(*(a+1)+2),a[1][2] |
1行2列元素a[1][2]的值 |
元素值为13 |
比较难理解的是 *(a+1)并不是a+1单元的内容(值),因为a+1并不是一个变量的存储单元,也就谈不上它的内容了。*(a+1)就是a[1]
#include <stdio.h>
#include <stdlib.h>
#include<string.h> int main()
{
int a[][]= {,,,,,},*p=&a[][];
printf("a[0]=%d\n",*a[]); //
printf("a[1]=%d\n",*a[]); //
printf("a[1]+1=%d\n",*a[]+); //
printf("(a[1]+1)=%d\n",*(a[]+)); //
printf("%d\n",*(p+)); //
return ;
}
必须清楚:二维数组名(如a)是指向行的,因此a+1中的1代表一行中全部元素所占的字节
一维数组名(如a[1])是指向列元素的,a[0]+1中的1代表一个a元素所占的字节数
在指向行的指针前面加一个*,就转换为指向列的指针如 *(a+1)
在指向列的指针前面加一个&,就成为指向行的指针
《C语言程序设计(第四版)》阅读心得(三)的更多相关文章
- python(第四版阅读心得)(系统工具)(一)
本章将会讲解python常用系统工具的介绍 python中大多数系统级接口都集中在两个模块: sys 和 os 但仍有部分其他标准模块也属于这个领域 如: 常见: glob 用于文件名扩展 soc ...
- 《C++程序设计语言(英文第四版)》【PDF】下载
<C++程序设计语言(英文第四版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382177 内容简介 本书是C++领域经典的参 ...
- 挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(二)
挂羊头卖狗肉蓄意欺骗读者——谭浩强<C程序设计(第四版)>中所谓的“按照C99”(二) 在<谭C>p4:“本书的叙述以C99标准为依据”,下面从C89到C99的主要变化方面来看 ...
- <C++Primer>第四版 阅读笔记 第一部分 “基本语言”
之前阅读时没有及时总结,现在慢慢补上. 第1章 快速入门 main 函数在很多方面都比较特别,其中最重要的是每个C++程序必须含有 main 函数,且 main 函数是(唯一)被操作系统显示调用的函数 ...
- 《LINUX程序设计 第四版》 阅读笔记:(一)
1. 头文件 使用-I标志来包含头文件. gcc -I/usr/openwin/include fred.c 2. 库文件 通过给出 完整的库文件路径名 或 用-l标志 来告诉编译器要搜索的库文件. ...
- 【Lua程序设计第四版练习题答案】ch01 Lua语言入门
联系1.1: 运行阶乘的示例并观察,如果输入负数,程序会出现什么问题?试着修改代码来解决问题. -- 定义一个计算阶乘的函数 function fact (n) if n == 0 then re ...
- C程序设计(第四版)课后习题完整版 谭浩强编著
//复习过程中,纯手打,持续更新,觉得好就点个赞吧. 第一章:程序设计和C语言 习题 1.什么是程序?什么是程序设计? 答:程序就是一组计算机能识别和执行的指令.程序设计是指从确定任务到得到结果,写出 ...
- C语言程序设计第四次作业--选择结构(2)
(一)改错题 输出三角形的面积和周长,输入三角形的三条边a.b.c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数):否则,输出"These sides do ...
- C语言程序设计:现代方法阅读笔记
第二十六章 atexit函数允许用户“注册”在程序终止时要调用的函数:atexit(func); 在程序终止后,func函数会被自动调用 clock()函数可以计算程序运行时间 time函数返回当前的 ...
- C++ Primer 第四版阅读笔记
阅读笔记 初始化 变量定义指定了变量的类型和标识符,也可以为对象提供初始值.定义时指定了初始值的对象被称为是 已初始化的.C++ 支持两种初始化变量的形式:复制初始化和 直接初始化.复制初始化语法用等 ...
随机推荐
- [USACO 2011 Nov Gold] Cow Steeplechase【二分图】
传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=93 很容易发现,这是一个二分图的模型.竖直线是X集,水平线是Y集,若某条竖 ...
- 【洛谷5398】[Ynoi2018]GOSICK(二次离线莫队)
题目: 洛谷 5398 当我刚学莫队的时候,他们告诉我莫队能解决几乎所有区间问题: 现在,当我发现一个区间问题似乎难以用我所了解的莫队解决的时候,他们就把这题的正解叫做 XXX 莫队.--题记 (以上 ...
- AC自动机 HDOJ 2222 Keywords Search
题目链接 题意:每个文本串的出现次数 分析:入门题,注意重复的关键字算不同的关键字,还有之前加过的清零. 新模板,加上last跑快一倍 #include <bits/stdc++.h> ...
- 转 PHP抽象类:无法实例化 (不错)
http://blog.csdn.net/kaituozheboke/article/details/52183726 一.抽象类: 无法实例化 类前加 abstract, 此类就成为抽象类,无法实例 ...
- MS SqlServer 通过数据库日志文件找回已删除的记录
1.建立演示数据(创建数据库数据表添加基础数据) 1.1 创建数据库 1.2 创建数据表 1.3填充数据 1.4做数据库完整备份 2.模拟误删除.记录操作时间.备份数据库日志 2.1删除数据并记录操作 ...
- 数据库时间类型是 datetime 类型的处理
当数据库时间类型是datetime类型时,获取前台时间是要这样处理 ,因为数据库是把时间转换为字符类型来比较的 sb.Append(" and Date <=convert(varch ...
- XCode的debug断点调试
debug 流程控制 当你通过 Xcode 的源码编辑器的侧边槽 (或者通过下面的方法) 插入一个断点,程序到达断点时会就会停止运行. 调试条上会出现四个你可以用来控制程序的执行流程的按钮. 从左到右 ...
- 【PostgreSQL-9.6.3】Red Hat 4.4.7下的安装
1. 下载源码包https://www.postgresql.org/ftp/source/v9.6.1/ 2. 上传到/opt目录下 3. 创建postgres用户及dba组,并修改压缩包的属主属组 ...
- (转)淘淘商城系列——dubbo监控中心
http://blog.csdn.net/yerenyuan_pku/article/details/72777623 之前我们就已学过了dubbo,想必大家对dubbo的架构有所了解,dubbo的架 ...
- 最小生成树Prim算法 Kruskal算法
Prim算法(贪心策略)N^2 选定图中任意定点v0,从v0开始生成最小生成树 树中节点Va,树外节点Vb 最开始选一个点为Va,其余Vb, 之后不断加Vb到Va最短距离的点 1.初始化d[v0]=0 ...