C语言学习系列-->看淡指针(2)

news2024/11/25 7:04:50

在这里插入图片描述

文章目录

  • 前言
  • 一、数组名的理解
  • 二、使用指针访问数组
  • 三、一维数组传参本质
  • 四、二级指针
  • 五、指针数组
  • 六、指针数组模拟二维数组

前言

不把指针学的扎实,可不敢说自己C语言基础学的好

一、数组名的理解

#include <stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("&arr[0] = %p\n", &arr[0]);
	printf("arr = %p\n", arr);
	return 0;
}

输出结果

在这里插入图片描述

所以,数组名就是数组第一个元素的地址

数组名就是数组⾸元素(第⼀个元素)的地址是对的,但是有两个例外:
sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,
单位是字节
&数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的)
除此之外,任何地⽅使⽤数组名,数组名都表⽰⾸元素的地址。

#include <stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("&arr[0] = %p\n", &arr[0]);
	printf("&arr[0]+1 = %p\n", &arr[0] + 1);
	printf("arr = %p\n", arr);
	printf("arr+1 = %p\n", arr + 1);
	printf("&arr = %p\n", &arr);
	printf("&arr+1 = %p\n", &arr + 1);
	return 0;
}

输出结果

&arr[0] = 0077F820
&arr[0]+1 = 0077F824
arr = 0077F820
arr+1 = 0077F824
&arr = 0077F820
&arr+1 = 0077F848

这⾥我们发现&arr[0]和&arr[0]+1相差4个字节,arr和arr+1 相差4个字节,是因为&arr[0] 和 arr 都是
⾸元素的地址,+1就是跳过⼀个元素。
但是&arr 和 &arr+1相差40个字节,这就是因为&arr是数组的地址,+1 操作是跳过整个数组的。

二、使用指针访问数组

#include<stdio.h>

int main() {
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;
	int i = 0;
	for (i = 0; i < sz; i++) {
		scanf("%d", p + i);
		//也可以写成scanf("%d",arr+i);
	}
	for (i = 0; i < sz; i++) {
		printf("%d ", *(p + i));
	}
	return 0;
}

本质上p[i] 是等价于 *(p+i),arr[i] 应该等价于 *(arr+i)

三、一维数组传参本质

之前我们都是在函数外部求数组的个数,那如果在函数内部呢?

数组名是数组⾸元素的地址;那么在数组传参的时候,传递的是数组名,也就是说本质上数组传参传递的是数组⾸元素的地址。

所以函数形参的部分理论上应该使⽤指针变量来接收⾸元素的地址。那么在函数内部我们写
sizeof(arr) 计算的是⼀个地址的⼤⼩(单位字节)⽽不是数组的⼤⼩(单位字节)。正是因为函
数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的。

#include<stdio.h>

void test(int arr[]) {
	printf("%d\n", sizeof(arr));
}

void test(int* arr) {
	printf("%d", sizeof(arr));
}

int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	test(arr);
	return 0;
}

⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

四、二级指针

是变量都有地址

那么,指针变量也是变量,它的地址在哪呢?

存放在二级指针

在这里插入图片描述

*ppa 通过对ppa中的地址进⾏解引⽤,这样找到的是 pa , *ppa 其实访问的就是 pa

int b = 20;
*ppa = &b;//等价于 pa = &b;

**ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作: *pa ,那找到的是 a .

**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;

五、指针数组

指针数组,是一个数组,数组里面每一个元素的类型都是指针类型

在这里插入图片描述

数组指针的每个元素是地址,⼜可以指向⼀块区域。

六、指针数组模拟二维数组

#include<stdio.h>

int main() {
	int arr1[5] = { 1,2,3,4,5 };
	int arr2[5] = { 2,3,4,5,6 };
	int arr3[5] = { 3,4,5,6,7 };
	int* parr[3] = { arr1,arr2,arr3 };
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 5; j++) {
			printf("%d ", parr[i][j]);
			//printf("%d", *(*(parr + i) + j));
			//parr[i][j] == *(*(parr + i) + j);
		}
		printf("\n");
	}
	return 0;
}

在这里插入图片描述
parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数组中的元素。

上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀⾏并⾮是连续的。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/868163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用python实现批量登录网络设备进行日常巡检

利用python实现批量登录网络设备 实现ensp与物理机互通ensp 配置配置网络设备远程登录 用python实现批量登录常见问题 通过阅读本文可以学习自动化运维相关知识&#xff0c;本文章代码可以直接使用&#xff0c;通过批量登录功能后&#xff0c;可以按照自己意愿进行功能更改与完…

电路基础笔记(更新中)

导体 导体是指那些能够轻易传递电荷&#xff08;电子&#xff09;的物质。在固体、液体或气体中&#xff0c;电子可以在导体内部自由移动&#xff0c;从而形成电流。导体的电导性取决于它的电子结构和能带特性。常见的导体包括金属&#xff08;如铜、铝、铁等&#xff09;以及一…

UNIX网络编程——TCP协议API 基础demo服务器代码

目录 一.TCP客户端API 1.创建套接字 2.connect连接服务器​编辑 3.send发送信息 4.recv接受信息 5.close 二.TCP服务器API 1.socket创建tcp套接字(监听套接字) 2.bind给服务器套接字绑定port,ip地址信息 3.listen监听并创建连接队列 4.accept提取客户端的连接 5.send,r…

怎么做Tik Tok海外娱乐公会呢?新加坡市场怎么样?

一、为什么选择TikTok直播 1. 海外市场潜力巨大 • 自2016年始&#xff0c;多家直播平台陆续拓展至东南亚、中东、俄罗斯、日韩、欧美、拉美等地区。 • 海外市场作为直播发展新蓝海&#xff0c;2021年直播行业整申请cmxyci体规模达百亿美元&#xff0c;并维持高速增长。 &a…

在阿里云服务器上安装部署WDCP主机管理系统教程

阿里云百科分享在阿里云服务器上安装部署WDCP主机管理系统流程&#xff0c;WDCP&#xff08;WDlinux Control Panel&#xff09;是一套Linux服务器及虚拟主机管理系统&#xff0c;通过Web控制和管理服务器。在WDCP的后台中&#xff0c;您可以更方便地使用Linux系统作为网站服务…

STM32CubeMX之freeRTOS消息队列

创建一个消息队列&#xff0c;两个发送任务&#xff0c;一个接受任务 发送任务一&#xff1a;等待时间为0 发送任务二&#xff1a;等待时间为最大 接受为0 简单来说就是&#xff1a; 任务一&#xff1a;一个普写 一个死写 一个普读 任务二&#xff1a;创造队列 一个普写 …

JDBC快速入门操作

一、jdbc简介 JDBC是java用于连接数据库的api&#xff0c;数据库软件有多种&#xff0c;像MySQL,SQLsever&#xff0c;Oracle等数据库&#xff0c;这些数据库都是由不同的团队开发的&#xff0c;所以相同的功能的api的名字不同&#xff0c;当一个后端工程需要切换一个数据库软件…

Java 实现敏感词检测

敏感词检测 敏感词的检测&#xff0c;一般是建立一个敏感词库&#xff0c;然后判断字符串中是否存在敏感词库中的某些词汇&#xff0c;然后将其过滤或者替换显示为其他文本&#xff0c;这对于一个和谐的网络环境是及其必要的&#xff0c;接下来就我们看看敏感词检测的实现方式…

Spring MVC 简介

目录 1. 什么是MVC2. 什么是SpringMVC 1. 什么是MVC MVC是一种常用的软件架构模式。可以看作是一种设计模式&#xff0c;也可以看作是一种软件框架。经典MVC模式中&#xff0c;M是指模型&#xff0c;V是视图&#xff0c;C则是控制器&#xff0c;使用MVC的目的是将M和V的实现代…

最强自动化测试框架Playwright(11)- 录制视频

视频 使用playwright&#xff0c;您可以录制测试视频。 录制视频 视频在测试结束时在浏览器上下文关闭时保存。如果手动创建浏览器上下文&#xff0c;请确保等待 browser_context.close&#xff08;&#xff09;。 context browser.new_context(record_video_dir"vid…

【Java】 java | git | win系统重装会给开发环境带来哪些问题

一、概述 1、近期发现电脑用起来不丝滑了&#xff0c;文件夹操作卡顿&#xff0c;一阵操作还会蓝屏 2、不能忍&#xff0c;整理排查 二、电脑情况 1、CPU&#xff1a; I5-9400F 2.9GHz 6核 2、内存&#xff1a; 32G 3、固态&#xff1a;256G 4、机械&#xff1a;1T 5、盘符使用…

Java基础篇--Number Math 类

目录 Number类 扩展小知识 Math类 实例 Number类 Java中的Number类是一个抽象类&#xff0c;它是所有包装类&#xff08;如Integer、Double、Long等&#xff09;的父类。这个类提供了将基本数据类型&#xff08;如int、double、long等&#xff09;封装为对象&#xff0c;…

[Leetcode] [Tutorial] 多维动态规划

文章目录 62. 不同路径Solution 62. 不同路径 一个机器人位于一个 m ∗ * ∗ n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。 问总共有多少条不同的路径&#xff1f; 示例…

QT-K线效果显示

QT-K线效果显示 一、演示效果二、关键程序三、程序链接 一、演示效果 二、关键程序 代码如下&#xff1a; #include "kvolumegrid.h"#include <QMessageBox> #include <QPainter> #include <QPen> #include <QString>kVolumeGrid::kVolume…

OpenCV实例(八)车牌字符识别技术(二)字符识别

车牌字符识别技术&#xff08;二&#xff09;字符识别 1.字符识别原理及其发展阶段2.字符识别方法3.英文、数字识别4.车牌定位实例 1.字符识别原理及其发展阶段 匹配判别是字符识别的基本思想&#xff0c;与其他模式识别的应用非常类似。字符识别的基本原理就是对字符图像进行…

iphone拷贝照片中间带E自动去重软件,以及java程序如何打包成jar和exe

文章目录 一、前提二、问题描述三、原始处理方式四、程序处理4.1 java程序如何打包exe4.1.1 首先打包jar4.1.2 开始生成exe软件使用方式 4.2 更换图标4.2.1 更换swing的打包jar图标4.2.2 更换exe图标 4.2 附件下载 一、前提 用苹果手机照相&#xff0c;有不使用默认的4:3拍照的…

【大数据之Kafka】一、Kafka定义消息队列及基础架构

1 定义 Kafka传统定义&#xff1a;Kafka是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 发布/订阅&#xff1a;消息的发布者不会将消息直接发送给特定的订阅者&#xff0c;而是将发布的消息分为…

React 组件防止冒泡方法

背景 在使用 antd 组件库开发时&#xff0c;发现点击一个子组件&#xff0c;却触发了父组件的点击事件&#xff0c;比如&#xff0c;我在一个折叠面板里面放入一个下拉框或者对下拉框列表渲染做定制&#xff0c;每个下拉框候选项都有一个子组件… 解决 其实这就是 Javascri…

头条移动端项目Day02—— app端文章查看、静态化freemarker、分布式文件系统minIO

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

Selenium之css怎么实现元素定位?

世界上最远的距离大概就是明明看到一个页面元素站在那里&#xff0c;但是我却定位不到&#xff01;&#xff01; Selenium定位元素的方法有很多种&#xff0c;像是通过id、name、class_name、tag_name、link_text等等&#xff0c;但是这些方法局限性太大&#xff0c; 随着自动…