《C语言参悟之旅》-读书笔记(六)

C语言参悟之旅.pdf C语言参悟之旅.pdf C语言学习相关资料,收藏一下 立即下载
 

                        第7章指针

C语言编写的程序至今仍能和汇编语言程序相媲美,其中一个重要原因就是拥有一种数据类型——指针(内存操作)

1.指针和地址 

 间接访问方式 

   通过变量来访问( 计算机用一个别称(变量)来标识存储单元,计算机在寻找内存的数据时就要先把这个别称翻译成地址才行  )

 直接访问方式

   通过地址来访问 

ps:  变量其实就是内存存储单元的一个临时的别名,而地址才是这个存储单元永久的真名

2 .初始化

  

       int  i = 0;

          int * p  ;

          p = & i;

注意:int *  a, b, c; 定义了一个指针变量a和两个整型变量b和c,

      int *a, *b, *c定义了三个指针变量;

3. 指针类型

   指针的时候必须指定其类型,不同类型的指针(p++)内存中移动的大小不一样

   指针变量里存放的的值只能是变量的地址

4 . 指针和一维数组 ( 数组名存放数组的首地址 )

    int a[ 3 ] ={1,2,3};              int a[ 3 ] ={1,2,3};

    int  * p;             或         int * p = a;

    p = &a[ 0 ];

    a[ 2 ]等价于 * (p+2); 

      

        

说明:

   a是一个地址,我们知道a其实本来的面目应该是:a+0,只不过这个0我们就省了,*(a+0)也就是a[0],所以我们可以知道a它代表的应该是第一个(下标为0)元素的地址。

       int a[ 4 ];

   什么是数组,其实我们可以把数组假设为一个基本类型变量,它的类型为 int [4].也就是变量a这个对象代表的就是4个int那么大小的一个区间,而且不可分割。它和一般变量不同的地方在于,它的操作受限,不能像一般变量那样,直接通过赋值符号一次性将整个区间的值赋值给另外一个相同的数组变量。而只能通过下标来一个个元素的赋值。

   通过上面的分析,&a就好理解了,他就是变量a的地址,这个变量a的作用范围是四个int空间的数据,也就是如果将&a赋给某个变量p,p的类型应该是:int (*)[4];也就是指向包含4个int数据的数组的指针。

    再来看看a+1和&a+1的区别,a+1表示的是数组第一个元素地址,&a+1表示的是跨过a数组的下一个地址。通过图来表示可能更加清晰可理解:

 

  

       

5.指针和二维数组

 &a[0]与a是等价的 都代表一行首元素的地址   &a[1]与a + 1等价  代表第二行首元素的地址

注:a[0]+0;      a[0]+1;    a[0] +2;   a[0]+3;

等价于 &a[0][0];    &a[0][1];   &a[0][2];     &a[0][3];

6.用指针来替换掉数组的下标

  1).对于一维数组 a[ 0 ] 等价于 * (a + 0)

  2).对于二维数组a[0][0]等价于a[0]+0或*(a+0 )+ 0  

8.字符串指针变量

 在C语言中,字符串是以字符数组的形式来实现的

 

  

9.与字符数组的不同:

 1)赋值的方式不同

   对于字符串指针变量

     char  * s = "hello" ;   

  或 

     char * s;

     s = "hello"; 

   对于字符数组

     int  * a[10] ={ "hello"};

    而不行:int a[10]

           a = “hello”;

 2) 地址是否可以改变

    字符串指针可以改变

    数组名不可以改变

10.可以用字符串变量和字符数组来表示一个格式化字符串

11.指针和函数

 I、用指针来传值的好处:

    1)能让形参的变化映射到实参中

    2)高效的传值方式(如复制大的对象时)

 II、指向函数的指针

   正在运行的程序(无论是数据和指令)都被存储在内存中,既然变量都有地址,那么指令也是有地址的,但指针不能被用来指向程序中的任意一条指令

   C语言中提供了另一种有一定限制的指令访问方式——指针变量可以指向一个函数(这个指针变量所存放的地址实际上就是函数中第一条指令的地址)

 III.使用方法:

IV.指向函数的指针最常用的地方:

   1)作为参数传给其他函数

   2)作为参数以实现地址的传递,也就是将函数名传递给形参

V.返回值为指针的函数:

 能够让函数返回多个值的方法:

  1)定义全局变量并将希望返回的值存储在全局变量

  2)把指针当作参数传给函数,

 

VI.返回指针值函数的错误使用

#include <math.h>
#include <stdio.h>
#define  M 5
#define  N 3
float * mean_byPerson(float score[][3]) 
{
	float sum = 0.0;
	float r[M];     //定义了一个一维数组,是局部变量,
	float * p = &r[0];
	int i = 0, j;
	for (; i<M; i++)
	{
		for(j =0;j<N;j++)
			sum += *(score[i]+j);
		r[i] = sum/(float)N;
		sum =0.0;
	}
	return p;   // 函数一旦返回,它所占用的空间就会被释放,
}               //即使保留一个指向r的指针p,也不可能得到数组r中原有的值
                                int main()
                                                                      {
	float score[M][N] =      //定义一个二维数组来存储这些学生的成绩单,
	{ {90,85,72},
	{100,80,75},
	{80,93,98},
	{60,53,75},
	{78,82,39} };
	float * m1 =mean_byPerson(score);
	printf("Everyones' mean score is as below:\n");
	for (int i = 0; i<M; i++) 
	{                         
		printf("%.2f\t", *(m1 + i));
	}
  }
 

 

 


 修改方法:在主函数中定义一个存放结果的数组,将该指针传给函数

#include <math.h>
#include <stdio.h>
#define  M 5
#define  N 3
float * mean_byPerson(float score[][3],float * r) //将要计算的数组,和存放结果的数组传入函数
{
	float sum = 0.0;
//	float r[M];     //定义了一个一维数组,是局部变量,
	float * p = &r[0];
	int i = 0, j;
	for (; i<M; i++)
	{
		for(j =0;j<N;j++)
			sum += *(score[i]+j);
		r[i] = sum/N;
		sum =0.0;
	}
	return p;   // 函数一旦返回,它所占用的空间就会被释放,
}               //即使保留一个指向r的指针p,也不可能得到数组r中原有的值
int main()
{
	float score[M][N] =      //定义一个二维数组来存储这些学生的成绩单,
	{ {90,85,72},
	{100,80,75},
	{80,93,98},
	{60,53,75},
	{78,82,39} };

	float r[M]; //在主函数中定义了一个数组,就可以避免在函数中定义的变量返回时被回收
	float * m1 =mean_byPerson(score,r);
	printf("Everyones' mean score is as below:\n");
	for (int i = 0; i<M; i++) 
	{                         
		printf("%.2f\t", *(m1 + i));
	}
}

 


总结:尽管指针函数可以起到返回一组值的作用,但也存在一定的局限性,即返回的指针所指向的不能是函数中的局部变量

12.复合多维指针的使用

 指针数组的定义

  数组的元素也可以是是指针类型;

  类型说明符 * 数组名[ 数组长度];

          int * p[ 3 ]

  上述语句表示p是一个指针数组,它由3个数组元素组成,每个元素都是指向一维数组的指针

指针数组的来那个典型用途:

1)可以用来指向一个二维数组 

 

 2)可以用来指向一组字符串(原理同上)

13.指向指针的指针一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量

 实际用途(类似前面的指针数组):

 举例(服务评价打分系统)   

C语言参悟之旅pdf C语言参悟之旅 立即下载

相关推荐

《c语言参悟之旅》简介

左飞老师的《c语言参悟之旅》推荐。本文件只包含一章,如需阅读,请购买正版图书

《C语言参悟之旅》新鲜试读(完结篇)

lizhaoheng1982的专栏 4909

C语言参悟之旅

本书作者将丰富的开发经验凝聚在方寸之间,以轻松易懂、深入潜出的笔调将C语言的世界描绘得有声有色。

c语言参悟之旅,《C语言参悟之旅》-读书笔记(一)

第一章 程序设计与C语言1.什么是计算机程序?计算机程序是指能使计算机做出信息处理行为并产生一定结果的指令集和(就像做菜的菜谱)2.高级语言的执行方式?( 1 )采用编译方式编译-----&gt;编译-----&gt;链接-----&gt;生产可执行文件(2)解释方式利用针对某种高级语言的解释软件,解释所遇到的高级语言中的每个操作并完成这些操作所要执行的动作高级程序员程序----------...

weixin_42521276的博客 355

电流舵DAC设计(一)

如果分辨率继续增加,温度计码译码逻辑成为面积的主要决定因素,数字版图面积增加,总的面积消耗成上升趋势。缺点是:对于高分辨率的 DAC,高位码元和低位码元权重相差很大,当输入码元转换时(以 8 位二进制型 DAC 为例)尤其是中码转换(从 01111111 转换到 10000000),因为此时电流源的选通动作并非理想情况下的绝对一致等因素,导致在极短的时间内,码元会从 01111111 跳转到 11111111 再跳到10000000,这个过程中所有开关都参与转换,会引起最大幅度的尖峰毛刺(glitch);

模拟芯片设计 2874

【RT-Thread】从零到一:RT-Thread Studio工程创建与程序下载全流程实战

本文详细介绍了RT-Thread Studio开发环境的安装与使用,从工程创建到程序下载的全流程实战指南。通过具体案例演示了如何在STM32平台上快速开发RT-Thread应用,包括时钟配置、内存优化、构建调试等关键技巧,帮助开发者高效完成嵌入式系统开发。

weixin_30336061的博客 545

《C语言参悟之旅》 -读书笔记(一)

最近在看《C语言参考之旅》,感觉这本书不错,作者有用心去写,也写出了一些实际开发过程中雪要注意的细节,和高校教师所编的书还是有一定区别,初看好像很简单,但仔细看还是有一定的深度,适合掌握了一些基本语法的 C语言学习者学习,本文记下了阅读过程中自己认为比较重要而在学校教材里没有讲透彻的地方摘录下来

瞎几波写 1104

汇川AM系列后台安全管理与用户权限的设置方法

汇川AM系列后台安全管理与用户权限的设置方法。

viixin的博客 8461

《C语言参悟之旅》-读书笔记(七)

第八章 预处理 cpp源文件——(预编译)》预处理文件——(编译)》目标文件——(连接)》可执行文件 预处理:源文件在进行编译时第一遍扫描之前做的工作(词法分析和语法分析) 程序员与预处理器进行交互的工具是一种被称作预处理器指示的命令(一些以“#”号开头的单行命令) 编译的源文件test.cpp #include #define PI 3.1415926 int main( ) {

linuxlinuxlinuxlinux的专栏 1855

别再为淘宝滑块发愁了!一个Python脚本自动获取x5sec cookie的保姆级教程

本文提供了一套完整的Python自动化解决方案,帮助开发者轻松应对淘宝滑块验证码问题。通过模拟浏览器行为、精准识别滑块缺口位置和生成拟人化移动轨迹,脚本能够自动获取关键的x5sec cookie,显著提升爬虫效率。教程涵盖环境配置、验证机制分析、代码实现及反检测策略,是解决淘宝滑块验证的实用指南。

weixin_30300225的博客 577

从放弃到再入门之拉格朗日对偶问题推导

普通同学的解法 无约束条件:求导就可以了 等式约束:代入消元,再求导 不等式约束:分情况讨论(在边界上和不在边界上),分别对应1,2的情况 然而发现,有些情况消元特别复杂,甚至不能求解 聪明同学的解法 发现:在最优点的情况下,约束曲面的法向量和目标函数的梯度反向必相同或相反 拉格朗日乘子法如何理解? (在2维里可以形象的解释为z=f(x,y)在约束条件g(x,y)=c中,极值...

qq_34564612的博客 1万+

《C语言参悟之旅》-读书笔记(八)

第九章   结构体和共用体 一、结构体 由一系列具有相同类型或不同类型的的数据构成的数据集合(但不能包含函数类型) 1.定义   1)第一种形式 struct 结构体类型名 { 数据类型名1 成员名1; ......... 数据类型名2 成员名2; }; struct 结构体类型名 变量名列表;   2)第二种形式 struct 结构体类型名 {

linuxlinuxlinuxlinux的专栏 1591

高通平台蓝牙学习-- 基于WCN6750 Bluetooth 5.2的讲解

摘要:蓝牙5.2解决方案WCN6750具备多项先进特性:完全兼容5.2标准及ANT+协议,支持2Mbps高速BLE和长距离传输;采用射频集成方案,与WLAN共享天线并支持5G并发;内置功率放大器,支持Class1/2传输;提供双音频流和Slimbus接口优化。其HCI UART接口支持3.2Mbps速率,通过BlueZ协议栈实现蓝牙5.2功能,包括2Mbps模式和长距离传输,符合核心规范要求。(149字)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 3万+

《C语言参悟之旅》-读书笔记(四)

第五章 函数 Ps:     函数的语法本身并不复杂,真正需要编程者去理解和体会的往往是如何用函数来拆解问题,使用函数的水平直接反映在编程者能够组织多大规模的程序 1.C语言中的main( )函数           main( )函数可以调用任何C语言函数;           但任何C语言函数都不能调用main( )函数,main( )函数通常在其所属的程序执行时被操作系统调用。 2

linuxlinuxlinuxlinux的专栏 816

解决pd.read_json报错ValueError: Trailing data问题

首先,我们使用open函数打开JSON文件,然后使用json.load函数将JSON文件数据解码为Python对象。在使用Python进行数据处理中,我们经常需要将JSON格式的数据读入到DataFrame中进行处理。而使用pandas库的read_json函数,就可以方便地将JSON数据读入到DataFrame中。但是有时候在读取JSON数据时,会遇到一个非常常见的错误:ValueError: Trailing data。这个错误的解决方案并不难,只需要在read_json中添加一个参数即可。

学习使你进步。 2234

SIMULINK开发项目实例 1000 例专栏之第960例--基于电力系统稳定性的建模与仿真场景:-含分布式电源的配电网电压稳定性研究

间歇性与随机性:例如,太阳能依赖于日照强度,风能依赖于风速,这使得它们的输出功率具有不确定性。逆变器接口:大多数分布式电源通过逆变器接入电网,这对电网的动态响应特性产生了影响。位置分散:通常分布在用户侧或靠近负荷中心的位置。本文详细介绍了如何使用Simulink结合Simscape Electrical 构建一个用于研究含分布式电源配电网电压稳定性的模型,并提供了详细的仿真流程说明。

xiaoheshang_123的博客 155

《C语言参悟之旅》-读书笔记(九)

第十章  文件 文件就是一组相关元素或数据的有序集合,每个集合都有一个符号化的指代(文件名) 文件通常都被存在外部存储器上,它只在需要使用时被调入内存 一.相关概念: 1.主要分类   1).  普通文件:驻留在磁盘或其他外部介质上的一些有序数据集,   2).设备文件(逻辑上的文件): 和主机相连的各种外部设备:如显示器、打印机、键盘 2.流的概念  流就是表示文本输入(或输出)

linuxlinuxlinuxlinux的专栏 2226

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

《C语言参悟之旅》-读书笔记(三)

第四章   流程控制 1.流程图(当初学的时候觉得很麻烦,现在觉得对整理编程思路帮助还是很大) 2.顺序结构   3.分支结构  1)形式 (  else 总是与其前面最近的 if 配对 )        A . if(表达式)               语句;        B. if(表达式)             语句1;           else

linuxlinuxlinuxlinux的专栏 748

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《C语言参悟之旅》-读书笔记(二)

第三章  运算符、表达式和语句 1.在表达式中使用(   )是一种很好的编程方式能大大提高程序的可读性如:            标准C中对很多运算符的求值顺序都没有进行明确规定,实现顺序与具体实现有关( 编译环境)                                                                        -a +b / 2 - c * 5

linuxlinuxlinuxlinux的专栏 895

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

《C语言参悟之旅》-读书笔记(一)

第一章    程序设计与C语言            1.什么是计算机程序?               计算机程序是指能使计算机做出信息处理行为并产生一定结果的指令集和(就像做菜的菜谱)         2.高级语言的执行方式?              ( 1 )采用编译方式                                  编译----->编译----->链接--

Ac Dream 864
上一篇: 《C语言参悟之旅》-读书笔记(五)
下一篇: 《C语言参悟之旅》-读书笔记(七)
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值