当前位置:网站首页>C语言中指针没那么难~(2)【文章结尾有资料】
C语言中指针没那么难~(2)【文章结尾有资料】
2022-07-30 20:18:00 【an520_】
指针与数组的区别
数组与指针在多数情况是可以等价的,比如:
但也有不等价的时候,比如如下三种情况:
数组名不可以改变,而指向数组的指针是可以改变的。
字符串指针指向的字符串中的字符是不能改变的,而字符数组中的字符是可以改变的。
求数组长度时,借用数组名可求得数组长度,而借用指针却得不到数组长度。
1、区别一
数组名的指向不可以改变,而指向数组的指针是可以改变的。
请看如下代码:
数组遍历方式一:使用指针遍历数组元素,* p++等价于*(p++),即指针指向的地址每次后移一个单位,然后再取地址上的值。这里的一个单位是sizeof(int)个字节。
数组遍历方式二:使用数组名自增遍历数组元素,编译出错,错误如下:
因为数组名的指向是不可以改变的,使用自增运算符自增就会改变其指向,这是不对的,数组名只能指向数组的开头。但是可以改为如下遍历方式:
这可以正确遍历数组元素。因为*(a+i)与a[i]是等价的。
2、区别二
字符串指针指向的字符串中的字符是不能改变的,而字符数组中的字符是可以改变的。
请看如下代码:
字符串定义方式一:字符串中的字符是可以改变的。如可以使用类似str[3]='q'这样的语句来改变其中的字符。原因就是:这种方式定义的字符串保存在全局数据区或栈区,是可读写的。
字符串定义方式二:字符串中的字符是不可以改变的。原因就是:这种方式定义的字符串保存在常量区,是不可修改的。
2、区别三
求数组长度时,借用数组名可求得数组长度,而借用指针却得不到数组长度。
请看如下代码:
运行结果
求数组长度方式一:借用数组名来求数组长度,可求得数组有5个元素,正确。
求数组长度方式二:借用指针求数组长度,求得长度为1,错误。原因是:
p只是一个指向int类型的指针,编译器不知道其指向的是一个整数还是指向一个数组。sizeof(p)
求得的是p这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。
下面还需要注意数组名的一个问题: 声明了一个数组 TYPE array[n]
, 则数组名是一个常量指针, 该指针的值是不能修改的, 即类似 array++
的表达式是错误的。
指针函数与函数指针
函数、指针这两个词结合的顺序不同其意义也不同,即指针函数与函数指针的意义不同。
1、指针函数
指针函数的本质是一个函数,其返回值是一个指针。示例如下:
由于“*”的优先级低于“()”的优先级,因而pfun首先和后面的“()”结合,也就意味着,pfun是一个函数。即:int *(pfun(int, int));
接着再和前面的“*”结合,说明这个函数的返回值是一个指针。由于前面还有一个int,也就是说,pfun是一个返回值为整型指针的函数。
指针函数示例程序如下:
程序运行结果如下:
主函数中,把一个数组的首地址与数组长度作为实参传入指针函数pfun里,把指针函数的返回值(即指向数组的指针)赋给整形指针p。最后使用指针p来遍历数组元素并打印输出。
2、函数指针
函数指针其本质是一个指针变量,该指针变量指向一个函数。C程序在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。函数指针示例:
func是一个函数名,那么func与&func都表示的是函数的入口地址。同样的,在函数的调用中可以使用:方式一:func(),也可以使用方式二:(*fun)()。这两种调用方式是等价的,只是我们平时大多都习惯用方式一的调用方法。
至于为什么func与&func的含义相同,《嵌入式Linux上的C语言编程实践》
这本书中有如下解释:
对于函数func来说,函数的名称就是函数代码区的常量,对它取地址(&func)可以得到函数代码区的地址,同时,func本身也可以视为函数代码区的地址。因此,函数名称和对其取地址其含义是相同的。
函数指针示例程序如下:
程序运行结果如下:
其中,函数指针广泛应用于嵌入式软件开发中,其常用的两个用途:调用函数和做函数的参数。
以上就是关于指针的的一些基础知识总结,如有错误欢迎指出!谢谢
【网盘学习资料包,需要的请放心领取】:
【华清远见】C语言/C++/Linux编程语言从入门到精通http://makerschool.mikecrm.com/ZfImObT
【下方是一些学习教程,感兴趣的可以看一下】:
边栏推荐
猜你喜欢
Weak Banks to data conversion ability?Matt software help solve bank dilemma
银行数据资产转换能力弱?思迈特软件助力解决银行困境
MySQL的Replace用法详解
化二次型为标准型
HMS Core Discovery第16期回顾|与虎墩一起,玩转AI新“声”态
湖仓一体电商项目(四):项目数据种类与采集
推荐系统:冷启动问题【用户冷启动、物品冷启动、系统冷启动】
Recommended system: cold start problem [user cold start, item cold start, system cold start]
【回归预测-lssvm分类】基于最小二乘支持向量机lssvm实现数据分类代码
Interviewer Ali: Describe to me the phenomenon of cache breakdown, and talk about your solution?
随机推荐
MySql 创建索引
用jOOQ 3.17投射类型安全的嵌套表记录
How to copy table structure and table data in MySQL
@WebServlet注解(Servlet注解)
都在说软件测试没前途,饱和了?为何每年还会增加40万测试员?
FFmpeg —— 将mp4转为gif输出(附源码)
MySQL 多表关联一对多查询实现取最新一条数据
基于人脸的常见表情识别(2)——数据获取与整理
【元胞自动机】基于元胞自动机模拟生命演化、病毒感染等实例附matlab代码
PR视频剪辑软件教程
如何解决gedit 深色模式下高亮文本不可见?
MySQL database master-slave configuration
excel数字如何转换成文本?excel表格数据转换成文本的方法
KEIL problem: [keil Error: failed to execute 'C:\Keil\ARM\ARMCC']
推荐系统-排序层-模型(一):Embedding + MLP(多层感知机)模型【Deep Crossing模型:经典的Embedding+MLP模型结构】
湖仓一体电商项目(四):项目数据种类与采集
TensorFlow2: Overview
Based on the face of the common expression recognition - model building, training and testing
WPS表格怎么自动1234排下去?wps表格怎么自动生成序号?
SQLyog注释 添加 撤销 快捷键