C语言之指针详解(1)

news2024/9/23 23:33:30

目录

 

本章重点
1. 字符指针
2. 数组指针
3. 指针数组
4. 数组传参和指针传参
5. 函数指针
6. 函数指针数组
7. 指向函数指针数组的指针
8. 回调函数
9. 指针和数组面试题的解析
大家对比前面C语言之指针初阶来看,指针进阶明显看起来难度大了很多,但是我们需要有迎难而上的勇气
指针的主题,我们在初级阶段的《指针》章节已经接触过了,我们知道了指针的概念:
1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间
2. 指针的大小是固定的4/8个字节(32位平台/64位平台)
3. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限
4. 指针的运算
1. 字符指针
在指针的类型中我们知道有一种指针类型为字符指针 char*
我们来看代码
#include<stdio.h>
int main()
{
	char arr[] = "abcdef";
	char* pc = arr;
	printf("%s\n", arr);
	printf("%s\n", pc);
	return 0;
}

为什么打印的结果是一样的呢?首先把一个字符串存放到字符数组里面,数组名赋给pc,pc就相当于指向那个字符数组,所以打印的内容是一样的

我们再看下一个代码

#include<stdio.h>
int main()
{
	char* p = "abcdef";//"abcdef"是一个常量字符串,这里相当于把字符串首元素的地址a放到了p当中,我们打印出来看效果
	printf("%s\n", p);
	return 0;
}

我们接着看代码

#include<stdio.h>
int main()
{
	char* p = "abcdef";//"abcdef"是一个常量字符串,这里相当于把字符串首元素的地址a放到了p当中,我们打印出来看效果
	*p = 'w';
	printf("%s\n", p);
	return 0;
}

既然我是常量字符串就不能被修改,大家理解一下,是不是只有变量才有被修改的可能

上述代码就报错了,希望大家能够理解,这种代码一律不能被修改,这是当我们联想一下const,我们来看代码

这样我们就完全把这个字符串限制死了,不能被修改

#include<stdio.h>
int main()
{
	const char* p = "abcdef";//"abcdef"是一个常量字符串,这里相当于把字符串首元素的地址a放到了p当中,我们打印出来看效果
	*p = 'w';
	printf("%s\n", p);
	return 0;
}

来看下面代码

#include<stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "acbdef";
	char* p1 = "abcdef";
	char* p2 = "abcdef";
	if (arr1 == arr2)
	{
		printf("hehe\n");
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}

打印haha,希望大家能理解,但是大家仔细看一看下一个代码呢

#include<stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "acbdef";
	char* p1 = "abcdef";
	char* p2 = "abcdef";
	if (*p1 == *p2)
	{
		printf("hehe\n");
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}

但是最好的方法是在char*前面加一个const避免被修改

#include<stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "acbdef";
	const char* p1 = "abcdef";
	const char* p2 = "abcdef";
	if (*p1 == *p2)
	{
		printf("hehe\n");
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}

我们接着看代码

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };//整型数组
	char ch[5] = { 0 };//字符数组
	int* parr[4];//存放整型指针的数组--指针数组
	char* pch[5];//存放字符指针的数组--指针数组
	return 0;
}

解释附在代码后面的了,希望大家能够理解,我们再来看下列代码

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int c = 30;
	int d = 40;
	int* arr[4] = { &a,&b,&c,&d };
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		printf("%d ", *(arr[i]));
	}
	return 0;
}

虽然我们打印出来了结果,但是这不是指针数组的本质用法,我们来看下列优化过的代码

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

指针数组里面存放的是各个数组的首元素的地址,地址加依次1解引用操作得到后面的数据,就得到了一个二维数组,这就是指针数组的正常操作方式,希望大家能够理解

下一节我们讲解数组指针

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

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

相关文章

TLS协议详解,一文带你了解TLS协议

前言 TLS&#xff08;Transport Layer Security&#xff09;是一种安全协议&#xff0c;用于保护网络通信的安全性和隐私性。它是SSL&#xff08;Secure Sockets Layer&#xff09;的后继者&#xff0c;用于在互联网上建立安全的通信连接。本文将介绍TLS的概论、工作原理、发展…

计算机网络——物理层-数据通信的基础知识

物理层的基本概念 在计算机网络中&#xff0c;物理层是网络协议栈中的第一层&#xff0c;负责处理网络中传输数据的物理介质和信号传输的细节。它定义了传输数据的电气、光学和机械特性&#xff0c;以及物理连接的规范和接口标准。 物理层的主要任务是将比特流&#xff08;0和…

C++之AVL树

目录 一.介绍二.简单实现AVL树1. 基本框架2. 插入结点(Insert)a. 更新平衡因子b. 左单旋c. 右单旋d. 左右双旋e. 右左双旋 3. 删除节点(Erase)a. 更新平衡因子b. 旋转c. 代码 4. 测试 一.介绍 作为对二叉搜索树的优化版本。AVL树是由俄罗斯的两位数学家G.M.Adelson-Velskii和E.…

Python 3 基本语法与基本数据类型 | 菜鸟教程(二)

目录 一、Python3 基础语法 &#xff08;一&#xff09;编码 &#xff08;二&#xff09;标识符 &#xff08;三&#xff09;python保留字 &#xff08;四&#xff09;注释 ​&#xff08;五&#xff09;行与缩进 &#xff08;六&#xff09;多行语句 &#xff08;七&am…

操作系统复习笔记3

1、条件变量和互斥锁 条件变量一般和互斥锁一起使用&#xff0c;来弥补互斥锁的不足。总得来说&#xff0c;互斥锁用来规范线程对共享数据的竞争使用&#xff0c;条件变量用来协调各个线程合作完成任务。 2、enum枚举类型 enum typeName { valueName1, valueName2, valueName3…

Workerman在线客服系统源码 附搭建文档

Workerman在线客服系统源码 模块化开发 强大的一键生成功能极速简化你的开发流程&#xff0c;加快你的项目开发 响应式布局 自动适配&#xff0c;无需要担心兼容性问题 完善的权限管理 自由分配子级权限、一个管理员司同时属于多个组别 通用的会员和API模块 共用同一账…

【MySQL多表查询】:让你的数据检索更高效

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL中多表查询相关知识的讲解 目录 前言一、多表关系二、多表查询1、交叉连接2、内连接3、外连接 三、集合运算四、七种JOINS实现五、多表查询练习六、总结 一、多表关系 ✨项目开发中&#xff0c;在进行数据库表结…

6月人工智能论文推荐

Prompt Space Optimizing Few-shot Reasoning Success with Large Language Models https://arxiv.org/abs/2306.03799 Prompt engineering 是通过提供明确和具体的指令来增强大型语言模型(llm)能力的基本技术。它使LLM能够在各种任务中脱颖而出&#xff0c;例如算术推理、问…

列表、表格、表单

day02&#xff1a;列表、表格、表单 目标&#xff1a;掌握嵌套关系标签的写法&#xff0c;使用列表标签布局网页 01-列表 作用&#xff1a;布局内容排列整齐的区域。 列表分类&#xff1a;无序列表、有序列表、定义列表。 无序列表 作用&#xff1a;布局排列整齐的不需要规…

Bean 的生命周期

观前提示:本篇博客演示使用的 IDEA 版本为2021.3.3版本,使用的是Java8(又名jdk1.8) 电脑使用的操作系统版本为 Windows 10 目录 Spring 的执行流程 1. 启动容器 2. 根据配置完成 Bean 的初始化 3. 注册 Bean 对象到容器中 4. 装配 Bean 的属性 Bean 的生命周期 Bean 的…

掌握Python的X篇_2_Python的安装

掌握Python的X篇_2_Python的安装 1. 软件安装包下载1.1 Python版本的区别1.2 同一版本不同安装包的区别 2. 安装过程3. 验证是否安装成功 1. 软件安装包下载 下载地址&#xff1a;https://www.python.org/downloads/ 可以看到最新版本和历史版本 1.1 Python版本的区别 就像…

express的使用(五) 简单的使用mongodb

原文链接 express的使用(五) 简单的使用mongodb 不要脸的求关注&#xff0c;希望能让大家批评我的不足点&#xff0c;一键三连最好了 看前提示 本篇主要描述关于express中使用mongodb以及mongodb的简单介绍还有初步使用&#xff0c;不涉及任何常用的语法&#xff0c;不建议有…

算法刷题-双指针-反转链表

反转链表的写法很简单&#xff0c;一些同学甚至可以背下来但过一阵就忘了该咋写&#xff0c;主要是因为没有理解真正的反转过程。 206.反转链表 力扣题目链接 题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2-…

AMD CPU微架构分析

一、SoC架构 1.1 整体架构 Zeppelin 参考链接&#xff1a;wikichip: Zeppelin 通过infinity fabric总线将单die分成多die的SoC架构&#xff0c;每个Die包含两个CPU核&#xff08;CCX&#xff09;、2各DDR通道、USB、低功耗IO以及多个IFOP和IFIS serdes接口。 如下所述中&…

干翻Mybatis源码系列之第十篇:Mybatis Plugins基本概念与拦截概述

给自己的每日一句 不从恶人的计谋&#xff0c;不站罪人的道路&#xff0c;不坐亵慢人的座位&#xff0c;惟喜爱耶和华的律法&#xff0c;昼夜思想&#xff0c;这人便为有福&#xff01;他要像一棵树栽在溪水旁&#xff0c;按时候结果子&#xff0c;叶子也不枯干。凡他所做的尽…

vue jointjs 拓扑图 自定义shape 按需引入

只展示部分核心代码&#xff0c;完整代码见文章尾部连接 import jointjs/dist/joint.core.css;// 类库 包含: Paper Graph Cell CellView Element Link 等等 import { dia } from jointjs/src/core.mjs; // 样式库 包含多个分组(basic standard custom ...) import * as standa…

基于Hexo和Butterfly创建个人技术博客,(11) 使用插件增强博客站点能力

Butterfly官方网站&#xff0c;请 点击进入 本章目标&#xff1a; 掌握常用的plugin插件的用法&#xff0c;本文中是butterfly主题内置集成的第三方插件(部分插件需要再次安装)&#xff1b; 一、建议开启的三方插件 KaTeX-数学公式 katex:enable: true# true 表示每一页都加载…

C# NX二次开发:通过UFUN函数获取刀具描述,目录号,库号等信息

今天要将的是&#xff0c;在NX中对CAM模块进行二次开发的时候&#xff0c;往往需要获取一些关于刀具使用的信息&#xff0c;这些信息用NXOPEN的的方法录制也可以录制出来&#xff0c;但是录制出来的代码&#xff0c;往往都是一种刀具类型会出现一个Builder。这样在你不知道有多…

淘宝买家订单API

目录 下载安装与运行 支持的订单读取方式 请求数据格式一 请求头示例 数据格式说明 数据格式示例 返回数据格式一 返回头示例 数据格式说明 数据格式示例 请求数据格式二&#xff08;根据订单编号&#xff09; 请求头示例 返回数据格式二&#xff08;根据订单编号…

【随笔记】如何获得铁粉(仅供参考)

文章目录 一、前言二、秘籍2.1 良好的个人简介2.2 统一的文章格式2.3 详细的专栏划分2.4 有序的博客排版2.4.1 目录部分2.4.2 正文部分2.4.2.1 标题分级2.4.2.2 正文分段2.4.2.3 善用多级列表2.4.2.4 章节分割 三、总结 一、前言 在这篇随笔记的开始&#xff0c;我想声明一下&a…