C进阶:指针的进阶(1)

news2024/10/4 22:29:56

回归 

哈喽哈喽大家好呀,我是灰灰快醒醒,时隔一个月又与大家见面了。众所周知,期末考试是中国教育部为大学生专门研发的一款开放式大逃杀游戏,学生需要扮演大难将至而绝望的人类,与小骚书共同完成《期末复习》的任务,不断逃离挂科的局面......所以作者一个月没写文章(借口)。

好了回归正题,今天讲解的内容是指针的进阶,我们继续探讨指针的高级主题(假装一本正经的样子)。

简要回顾(指针的简介)

我们都知道,计算机当中的内存会划分为一个个内存单元,每个单元都有独立的编号地址,而地址在C语言中称为指针。简:编号=地址=指针

指针(地址)需要存储起来——存储至变量中,该变量为指针变量。指针变量的大小根据(32/64)位平台分为(4/8)两种大小。

新内容学习

字符指针

顾名思义:字符指针就是指向字符的指针,所以其类型为char*。

一般使用如下:

#include<stdio.h>

int main()
{
	char ch = 'a';
    //定义指针变量p,指向ch的类型为字符类型
	char* pc = &ch;
	*pc = 'b';
	return 0;
}

还有一种使用方法如下:

#include<stdio.h>

int main()
{
    //这里是将一个字符串放入到pstr指针变量里面了吗?
	char* pstr = "hello";
	printf("%s\n", pstr);
	return 0;
}

这段代码的打印结果就是是“hello”,所以就会有人误解为将这一整段字符串放入指针pstr里面了,但实际上是将hello的首字符的地址放入了pstr指针当中

上面代码的意思就是把一个常量字符串的首字符h的地址存放到指针变量pstr当中了

下面再看这样一道题:

#include<stdio.h>

int main()
{
	char str1[] = "hello";
	char str2[] = "hello";
	char* str3 = "hello";
	char* str4 = "hello";

	if (str1 == str2)
		printf("str1 and str2 are same\n");
	else	
		printf("str1 and str2 are not same\n");

	if (str3 == str4)
		printf("str3 and str4 are same\n");
	else
		printf("str3 and str4 are not same\n");
		
	return 0;
}

上面一段代码的结果又是什么,让我们看一下输出:

 为何会出现这样的结果,让我们来逐一分析一下:

要首先记住这几个关键的概念:

1.般情况下,数组名代表的是数组首元素的地址。

2.常量字符串是不允许被修改的。

(1)str1 和 str2 :分别创建了str1[ ]和str2[ ]这两个独立的数组,所以它们在内存中的存放的地址也肯定不相同,所以首个字符的地址也肯定不同,所以判断出来是不相同的。

(2)str3 和 str4 : 首先定义一个指向hello第一个字符的指针变量str3,然后因为上面第二个概念嘛,定义第二个指针变量str4一定还是指向同一个字符串的第一个字符,所以它们指向的是同一个位置。

指针数组

定义:指针数组是一个存放指针的数组,数组中的每一个元素的类型是指针类型

数组我们已经知道的有整型数组与字符数组等。

int arr[ ]

char arr[ ]

它们的类型一个是整型int,一个是字符类型char

因此类比得到整型指针数组和字符指针数组

int* arr[ ]

 char* arr[ ]

数组指针可以用来模拟二维数组,举例如下:

#include<stdio.h>

int main()
{
	int arr1[] = { 1,2 };
	int arr2[] = { 3,4 };
    //定义一个指针数组,两个元素分别为前面两个数组的首元素地址
	int* arr[] = { arr1,arr2 };
	int i = 0;
    //循环遍历数组
	for (i = 0; i < 2; i++)
	{
		int j = 0;
		for (j = 0; j < 2; j++)
		{
        //*(*(arr + i) + j) -> *(arr[i] + j) -> arr[i][j]
			printf("%d ", *(*(arr + i) + j));
		}
		printf("\n");
	}
	return 0;
}

数组指针

定义:能够指向数组的指针。

基本书写格式:类型 (*数组指针名)[元素数量]

eg:int (*p) [10]

解释:p先和*结合,说明p是一个指针变量,然后指向的是一个数组大小为10的整型数组,所以p是一个指针,指向数组,叫做数组指针。

这里要注意: [ ]的优先级是大于*的,所以要先使用()以此保证p与*先结合。

那数组指针是怎么使用的呢?

既然数组指针指向的是数组,那数组指针中存放的应该是数组的地址。

一个数组指针的使用:还是以遍历二维数组为例:

#include <stdio.h>

//注意二维数组传参时,数组指针还是可以省略行,不可以省略列
void print_arr(int (*p)[5],int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("%-3d", p[i][j]);
		}
		printf("\n");
	}
}

int main()
{
	int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
	//数组名arr,表示首元素的地址
	//但是在二维数组当中,首元素就是第一行
	//所以这里传递的arr就是第一行的地址,也就是一维数组的地址
	//所以我们可以使用一个数组指针来接收一行的地址
	print_arr(arr, 3, 5);
	return 0;
}

打印结果如下:

 学了指针数组和数组指针让我们一起来看看下面代码的意思:

int arr[5];
//定义一个整型数组,数组中共有五个元素
int *parr1[10];
//定义一个指针数组,每个元素的类型为int*,共有十个元素
int (*parr2)[10];
//定义一个数组指针parr2,其指向一个大小为10的整型数组
int (*parr3[10])[5];
//可以将*parr3[10]看作*p所以总的来说它是一个数组指针,
//指向一个大小为5的整型数组,而*parr3[10]又可以看成一个指针数组
//因此可以将它看成一个10行5列,每个元素为int的二维数组

这一期就讲到这里,感谢各位观众老爷支持。

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

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

相关文章

【无标题】采用技术外包做项目开发,不得不说的四大注意事项

在进行多项目开发及多个研发供应商团队管理&#xff08;技术外包管理&#xff09;时&#xff0c;你是不是也遇到不少问题。 项目管理者A&#xff1a;在项目开发中聘用外包技术团队的过程中&#xff0c;我踩过太多的坑&#xff0c;换过一批又一批的供应商&#xff0c;之前遇到过…

I.MX8MM系统构建 -- 1.系统烧录

硬件环境&#xff1a;米尔 MY8-C8MMX V1.3开发板软件工具&#xff1a;uuu烧录工具 环境准备 硬件环境 将开发板拨码开关调整为SW1(ON,OFF,x,x) SW2(x,x,x,x)&#xff0c;按照丝印字体方向向上为OFF&#xff0c;向下为ON。将开发板USB连接到PC给开发板通上12V电源(注意先修改拨…

Django框架之CSRF使用篇

Django框架之CSRF使用篇 目录 全局使用 设置csrf token 表单使用 脚本使用 单独豁免 引入csrf类库 设置单独豁免csrf 单独保护 关闭全局csrf 引入csrf库 设置函数保护 csrf token配置 总结 全局使用 Django项目配置中默认全局使用csrf中间件&#xff0c;注释掉即…

最新Jupyter Notebook(保姆级教程)

Jupyter Notebook介绍 什么是Jupyter Notebook Jupyter Notebook 是一个基于 Web 的交互式计算环境&#xff0c;支持多种编程语言&#xff0c;包括 Python、R、Julia 等。它的主要功能是将代码、文本、数学方程式、可视化和其他相关元素组合在一起&#xff0c;创建一个动态文…

STM32 Proteus仿真语音播报SGP30火灾报警器温度湿度-0072

STM32 Proteus仿真语音播报SGP30火灾报警器温度湿度-0072 Proteus仿真小实验&#xff1a; STM32 Proteus仿真语音播报SGP30火灾报警器温度湿度-0072 功能&#xff1a; 硬件组成&#xff1a;STM32F103C6单片机 0.960LED显示屏DHT11温度湿度电位器模拟SGP30二氧化碳传感器蜂鸣…

Layui实现动态树效果(书籍管理系统左侧下拉列表)

目录 一、前言 1.什么是树形菜单 2.树形菜单的使用场景 二、案例实现 1.需求分析 2.前期准备工作 ①导入依赖 ②工具类 BaseDao&#xff08;通用增删改查&#xff09; BuildTree(完成平级数据到父子级的转换) ResponseUtil&#xff08;将数据转换成json格式进行回显&…

1、Kubernetes 概述和架构

目录 一、基本介绍 二、kubernetes功能和架构 2.1、 概述 2.2 、功能 &#xff08;1&#xff09;自动装箱 &#xff08;2&#xff09;自我修复(自愈能力) &#xff08;3&#xff09;水平扩展 &#xff08;4&#xff09;服务发现 &#xff08;5&#xff09;滚动更新 &a…

磷铁环压脱机液压站比例阀放大器

冷轧热镀锌线液压系统比例阀放大器 热轧带钢步进梁式加热炉液压系统比例阀放大器 热轧带钢液压系统比例阀放大器 板坏连铸液压系统比例阀放大器 钢包精炼炉液压系统比例阀放大器 磷铁环压脱机液压站比例阀放大器 热轧带钢液压系统是一种用于热轧带钢生产的液压系统。它的…

校招失败后,在小公司熬了 2 年终于进了华为,竭尽全力....

其实两年前校招的时候就往华为投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里这两年除了工作以外&#xff0c;也会坚持写博客&#xff0c;也因此结识了很多优秀的小伙伴&#xff0c;从他们身上学到了特别…

LiveGBS流媒体平台GB/T28181功能-支持UDP、TCP被动、TCP主动模式流传输模式之间有什么区别?

LiveGBS流媒体平台-国标流媒体服务几种流传输模式UDP、TCP被动、TCP主动模式区别是什么 1、背景1、GB28181流传输模式1.1、UDP1.2、TCP 被动1.3、TCP 主动 2、切换流传输模式2.1、编辑2.2、下拉切换 3、搭建GB28181视频直播平台 1、背景 国标GB28181协议中&#xff0c;视频流到…

什么是人工智能中的数据标注?

人工智能数据标注是对文本、视频、图像等元数据进行标注的过程&#xff0c;标记好的数据将用于训练机器学习的模型。常见的数据标注类型有文本标注、语义分割和图像视频标注。这些经标注的训练数据集可用于训练自动驾驶、聊天机器人、翻译系统、智能客服和搜索引擎等人工智能应…

LeetCode[239]滑动窗口最大值

难度&#xff1a;Hard 题目&#xff1a; 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xf…

强化学习课程笔记一

强化学习基础概念及MDP算法&#xff0c;如图1所示 这张ppt上就展现了一节课全部的内容&#xff1a; Sets中有表示状态的S、有表示动作的A(s)、有表示奖励的R(s,a)&#xff0c;如图二所示 也介绍了概率分布&#xff08;Probability distribution&#xff09; 其中State transi…

2D组态:智慧生物质发电厂组态监控系统

进入21世纪以来&#xff0c;我国面临的能源安全和环境生态保护问题日趋严峻&#xff0c;可再生能源已经成为能源发展战略的重要组成部分以及能源转型的重要发展方向。根据可再生能源应用的不同领域&#xff0c;电力系统建设正在发生结构性转变&#xff0c;可再生能源发电已开始…

【技能实训】DMS数据挖掘项目-Day06

文章目录 任务6【任务6.5】编写物流数据分析类【任务6.6】创建物流数据分析测试类&#xff0c;测试任务6.5-6.6中的程序&#xff0c;演示物流信息的采集、分析及打印输出 任务6 【任务6.1】创建数据分析接口 在com.qst.dms.gather 下创建接口IDataAnalyse.java 【任务6.2】创…

【多线程进阶】多线程进阶学习(高并发、线程池、多线程使用场景)

文章目录 1、线程基础知识1.1、线程和进程线程和进程的区别&#xff1f; 1.2、并行与并发并行与并发有什么区别&#xff1f; 1.3、线程的创建方式创建线程的方式有哪些&#xff1f;刚才你说过&#xff0c;使用runnable和callable都可以创建线程&#xff0c;它们有什么区别呢&am…

MySQL数值

1.整数类型 TINYINT&#xff1a;非常小的整数&#xff0c;存储空间为1字节&#xff0c; 取值范围&#xff1a;有符号&#xff1a;-128---127&#xff0c;无符号&#xff1a;0---255 SMALLINT&#xff1a;小整数&#xff0c;存储空间为2字节 取值范围&#xff1a;有符号&#…

岩土工程振动在线监测:以道路桥梁基础为例

岩土工程振动在线监测&#xff1a;以道路桥梁基础为例 使用振弦传感器、采集仪和在线监测系统进行岩土工程监测&#xff1a;以道路桥梁基础振动监测为例 一个应用振弦传感器、振弦采集仪和在线监测系统构成的岩土工程监测案例是道路桥梁基础的振动监测。 在道路桥梁基础的振动…

力扣 455. 分发饼干

题目来源&#xff1a;https://leetcode.cn/problems/assign-cookies/description/ C题解1&#xff1a;将大饼干优先大胃口的孩子。 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.…

代码随想录二刷 day50 | 动态规划 之 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

day50 123.买卖股票的最佳时机III1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 188.买卖股票的最佳时机IV1.确定dp数组以及下标的含义2.确定递推公式4.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 123.买卖股票的最佳时机I…