当前位置: 首页 > news >正文

C语言复习:数组和指针

目录

1.数组指针

2.指针数组

3.函数指针

4.const和指针

5.sizeof和指针和数组

6.strlem和数组


1.数组指针

(1)首先我们得理解什么是数组指针?

答:在数组指针中间我们加一个‘的’就可以很显而易见的发现,“数组的指针”,也就是指向数组的指针

如下图是一个很简单的一维数组指针的应用:

(2)数组指针常用于二维数组的创建和操作。下面我们来探讨二维数组指针的具体应用。

图中括号内的*表示 p 是一个指针,指向一个由 2个整数组成的数组 - 这正是变量 arr 中每个一维数组的类型。

由于()的优先级高于*,必须使用括号。若直接写成 int *p[2],则会被解释为 int *(p[2]),此时 p 就变成了指针数组,而非指向二维数组的指针。

此外,还存在着一个至关重要的等价关系:

arr+i == p+i

arr[i] == p[i] == *(arr+i) == *(p+i)
arr[i][j] == p[i][j] == *(arr[i]+j) == *(p[i]+j) == *(*(arr+i)+j) == *(*(p+i)+j)

2.指针数组

(1)首先我们得理解什么是指针数组?

答:指针数组是一种特殊的数组,其元素均为指针。每个数组元素存储的是内存地址,而非直接的数据值。

它的一般形式为:

int a = 1, b = 2;
int *ptr_arr[2] = {&a, &b}; // 指针数组存储变量地址
printf("%d", *ptr_arr[0]); // 输出1

3.函数指针

(1)掌握函数指针的概念至关重要

函数指针是一种指向函数的指针变量,存储函数的入口地址。通过函数指针可以间接调用函数,实现动态绑定或回调机制。其类型由函数的返回值类型和参数列表决定。

由下图所示可知函数名就是函数的地址,当然也可以通过&函数名的方法获得函数的地址

函数指针的基本应用示例如下:

函数指针类型解析: 

函数指针的应用:

下图为输出的结果:

4.const和指针

(1)首先我们需要明确const的作用是什么?

变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。 但是如果我们希望⼀个变量加上⼀些限制,不能被修改,怎么做呢?这就是const的作⽤。

上述代码中n是不能被修改的,其实n本质是变量,只不过被const修饰后,在语法上加了限制,只要我 们在代码中对n就⾏修改,就不符合语法规则,就报错,致使没法直接修改n。

但是如果我们绕过n,使用n的地址,去修改n就能做到了,虽然这样做是在打破语法规则。

下图为输出的结果:

我们可以看到这里⼀个确实修改了,但是我们还是要思考⼀下,为什么n要被const修饰呢?就是为了 不能被修改,如果p拿到n的地址就能修改n,这样就打破了const的限制,这是不合理的,所以应该让 p拿到n的地址也不能修改n,那接下来怎么做呢?

(2)const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本身的内容可变。

const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指 向的内容,可以通过指针改变。

5.sizeof和指针和数组

在学习操作符的时候,我们学习了 sizeof , sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。 sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据。

1. sizeof是操作符

2. sizeof计算操作数所占内存的大小, 单位是字节

3. 不关注内存中存放什么

6.strlem和数组

strlen 是C语言库函数,功能是求字符串长度。函数原型如下

统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。 strlen 函数会⼀直向后找 \0 字符,直到找到为止,所以可能存在越界查找。

1. strlen是库函数,使用需要包含头文件 string.h

2. srtlen是求字符串长度的,统计的是 \0 之前字符的隔个数

3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界

http://www.dtcms.com/a/263974.html

相关文章:

  • 数据结构day5——队列和树
  • 转录组分析流程(三):功能富集分析
  • HakcMyVM-Arroutada
  • Rust 学习笔记:比较数值
  • Prompt生成指南
  • 数据结构与算法--蛇行矩阵问题
  • WPF学习笔记(17)样式Style
  • 【机器学习2】正则化regularizaiton(降低模型过拟合)
  • Http、Ftp、Dns和Dhcp服务器搭建
  • Go 服务如何“主动”通知用户?SSE广播与断线重连实战
  • 从docker-compose快速入门Docker
  • VCenter SSL过期,登录提示HTTP 500错误解决办法
  • Linux驱动学习day13(同步与互斥)
  • 记录一次生产环境ActiveMQ无法启动的问题
  • 变幻莫测:CoreData 中 Transformable 类型面面俱到(八)
  • Raspberry Pi 4边缘智能PLC:OpenPLC赋能物联网
  • 25-7-1 论文学习(1)- Fractal Generative Models 何恺明大佬的论文
  • 半导体和PN结
  • 遥感影像岩性分类:基于CNN与CNN-EL集成学习的深度学习方法
  • 胖喵安初 (azi) Android 应用初始化库 (类似 Termux)
  • Adobe AI高效设计技巧与创新思维指南
  • day41简单CNN
  • 注意力得分矩阵求解例子
  • 网站崩溃的幕后黑手:GPTBot爬虫的流量冲击
  • 第七讲~~测试工具(禅道项目管理系统)
  • 【记录】Word|Word创建自动编号的多级列表标题样式
  • poi java 删除word的空白页
  • 【docker】docker save和docker load
  • 通达信【极弱强势指标与股道波段交易系统】幅图
  • Gin 中间件详解与实践