C语言 【大白话讲指针(中)】

        在之前的文章中我们已经知道了指针的概念,指针就是一个变量,用来存放地址,地址指向唯一一块内存空间。指针的大小是固定的4/8个字节(32为机器/64位机器)。指针是有类型的,指针的类型决定了指针加减整数的步长,也指定了该指针在解引用操作时候的权限。

1、字符指针

        字符指针的标识:char*,一般的使用方式如下:

int main()
{char ch = 'w';char *pc = &ch;*pc = 'w';//通过解引用地址进行修改return 0;
}

        还有一种常见的使用方式:

int main()
{char* pstr = "hello world.";printf("%s\n", pstr);return 0;
}

        注意:上面的赋值方式并非将整个字符串赋值给pstr,而是将"hello world."的首字符‘h’的地址存放在指针变量pstr中。说到这里可以看一道笔试题:

#include <stdio.h>
int main()
{char str1[] = "hello world.";char str2[] = "hello world.";char *str3 = "hello world.";char *str4 = "hello world.";if(str1 ==str2)printf("str1 and str2 are same\n");elseprintf("str1 and str2 are not same\n");if(str3 ==str4)printf("str3 and str4 are same\n");elseprintf("str3 and str4 are not same\n");return 0;
}

        程序的运行结果为:

        为什么会出现这样的结果? 

        str1和str2为两个数组,这两个数组的数组名为数组首元素的地址。在创建数组时候,程序会在内存中开辟两个空间用于存放这两个字符串,也可以理解成对数组进行初始化,虽然内容一样,但表示完全不同的两个东西。

        再来看一下str3和str4,它们属于两个字符类型的指针变量。它们指向的内容为"hello world."这个字符串,"hello world."本身是一个常量字符串,存储在内容中的静态区中。str3和str4均指向静态区中的同一个常量字符串,所以str3和str4的值是相同的。

2、指针数组

        提到指针数组,不得不想起数组指针。这两个概念经常使得初学者晕头转向。让我们来慢慢分析。指针数组本质上是一个数组,就像漂亮美女的本质是美女而不是漂亮,如果实在理不清楚,就请记住最后两个字最重要!!那么,是不是就明白指针数组的本质就是数组了呢?

        所谓指针数组,就是一个数组,该数组存放的元素的类型为指针类型,具体是何种指针还要具体分析,举一组例子:

int* arr1[10]; //整形指针的数组

        先来找数组名arr1,根据操作符的优先级,arr1先和后面的中括号结合形成arr1[10],此时很明确,arr1[10]表示一个能存放十个元素的数组,那么存放的数据是什么类型呢?让我们回头看还剩下int* ,那么就说明arr1[10]中存放的元素为int* 类型的数据。

        再简单地复述一遍,arr1是一个能存放10个整型指针变量的数组。

char *arr2[4]; //一级字符指针的数组
char **arr3[5];//二级字符指针的数组

         再来看上面的这两个例子,arr2是一个能存放4个字符指针类型变量的数组。arr3是一个能存放5个二级字符指针的数组。现在感觉怎么样?是不是很清晰明了!

3、数组指针

        高个子男孩本质是男孩而不是高个子,那么数组指针本质就是指针了。数组指针就是指向数组的指针,再重复一遍,这个指针指向的对象是一个数组。让我们来看一个数组指针。

int (*p2)[10];

        还是同样的道理,上来先看变量名p2,p2被括号与*包起来,所以p2首先是一个指针。是指针总有一个类型,拿掉(*p2)剩下的int  [10]就是这个指针的类型。这个类型说明这个指针指向的对象是一个含有10个整形元素的数组。

        再来复述一遍:p2是一个指向含有10个整型元素数组的指针。

4、数组参数、指针参数

4.1一维数组传参

#include <stdio.h>
void test(int arr[])//ok?
{}
void test(int arr[10])//ok?
{}
void test(int *arr)//ok?
{}
void test2(int *arr[20])//ok?
{}
void test2(int **arr)//ok?
{}
int main()
{int arr[10] = {0};int *arr2[20] = {0};test(arr);test2(arr2);
}

        要保证传参时不发生错误,就是要保证在传递的值和接收的值为同一个类型。就好比在古代的几品的官员就要做对应品级的轿子,这是一个道理。我们来看test()函数中传递了一个数组名arr,数组名是数组首元素的地址,也就是说arr是一个整型数据的地址,那么arr就应该是int*类型,在接受参数时,可以直接写int arr[],当然int* arr也是没有任何问题的。

        对于test2函数, int *arr2[20]是一个指针数组,arr2表示数组首元素的地址,也就是说arr2是一个整型指针的地址,那么arr2就是一个二级指针。在传递参数时可以直接使用int *arr[20],当然也可以使用int** arr来接收参数。

4.2、二级指针传参

#include <stdio.h>
void test(int** ptr)
{printf("num = %d\n", **ptr); 
}
int main()
{int n = 10;int*p = &n;int **pp = &p;test(pp);test(&p);return 0;
}

        有一句歌词唱得好,客人来了有美酒,豺狼来了有猎枪。同样的道理,传递什么类型的数据就使用什么类型的数据来接收。

5、函数指针

        函数指针本质也是一个指针,指针指向的内容为函数。

void (*pfun1)();

        同样的分析方法,pfun1和*被括号包起来,表名pfun1为一个指针,拿走它剩下void ()表明这个指针指向的内容为一个返回值为void类型的函数。

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

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

相关文章

大数据分析在市场营销中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 大数据分析在市场营销中的应用 大数据分析在市场营销中的应用 大数据分析在市场营销中的应用 引言 大数据分析概述 定义与原理 发…

启明云端触觉智能与您相约2024年慕尼黑国际电子元器件博览会,不见不散!

展会信息 展会日期: 2024年11月12-15日 展馆名称: 慕尼黑国际展览中心 MesseMnchen exhibition center 展馆地址: Messegelnde 81829 Mnchen Germany 启明云端&触觉智能展位号&#xff1a;B6-351 诚邀您莅临我司展位&#xff0c;让我们在慕尼黑不见不散&#xff01; …

OPPO开源Diffusion多语言适配器—— MultilingualSD3-adapter 和 ChineseFLUX.1-adapter

MultilingualSD3-adapter 是为 SD3 量身定制的多语言适配器。 它源自 ECCV 2024 的一篇题为 PEA-Diffusion 的论文。ChineseFLUX.1-adapter是为Flux.1系列机型量身定制的多语言适配器&#xff0c;理论上继承了ByT5&#xff0c;可支持100多种语言&#xff0c;但在中文方面做了额…

【JavaEE初阶】网络原理(4)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 网络层 > IP协议 IP协议报头结构 4位版本 4位首部长度 8位服务类型(TOS) 16位总长度(字节数), 16位标识 3位标志位 13位片偏移 8位生存时间(TTL) 8位协议 16位首部…

树莓派上安装与配置 Nginx Web 服务器教程

在树莓派上配置 Nginx 作为 Web 服务器的步骤如下&#xff1a; 1. 更新树莓派 首先&#xff0c;确保你的树莓派系统是最新的。打开终端并执行以下命令&#xff1a; sudo apt update sudo apt upgrade -y2. 安装 Nginx 在树莓派上安装 Nginx&#xff1a; sudo apt install …

Android Studio 中关于com.github.barteksc:android-pdf-viewer 无法正确加载的问题

Android Studio 的app 模块下&#xff0c;添加依赖&#xff1a; implementation com.github.barteksc:android-pdf-viewer:3.2.0-beta.1 运行程序报错&#xff1a; Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveEx…

[JAVA]Maven项目标准结构介绍

什么是Maven&#xff1f; Maven 是一个强大的项目管理和构建自动化工具&#xff0c;在Java开发中&#xff0c;一个项目通常会依赖许多外部的库&#xff0c;比如开发一个Web应用可能需要依赖Servlet APL&#xff0c;Spring框架等&#xff0c;和需要引入大量的Jar包。往往一个Ja…

Ansys EMC Plus:MHARNESS 串扰演示

Ansys EMC Plus 是一款强大的工具&#xff0c;专门用于分析电磁场及其影响&#xff0c;涵盖电磁兼容性和雷电效应分析等领域。 在本演示中&#xff0c;我们将探讨建立 MHARNESS 仿真的基础知识。这包括构建基本电缆线束、创建 MHARNESS 源和设置 MHARNESS 探针的过程。 概述 …

星环大数据平台--TDH部署

1.1 准备一台虚拟机 正常安装一台新的虚拟机&#xff0c; 内存16G&#xff0c;cpu8核&#xff0c;硬盘50G 1.2 安装前系统配置改动 修改/etc/hosts文件&#xff0c;确保hostname该文件包含节点的hostname和IP地址的映射关系列表。 hostname由数字、小写字母或“-”组成&am…

B+树与聚簇索引以及非聚簇索引的关系

B树、聚簇索引和非聚簇索引是数据库系统中非常重要的概念&#xff0c;它们共同决定了数据的存储和查询效率。本文将详细解释B树的结构&#xff0c;以及聚簇索引和非聚簇索引的区别和联系&#xff0c;使读者能够更好地理解这些概念。 1.B树简介 B树是一种多路平衡树&#xff0c;…

IoTDB 与 HBase 对比详解:架构、功能与性能

五大方向&#xff0c;洞悉 IoTDB 与 HBase 的详尽对比&#xff01; 在物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的采集、存储和分析是确保系统高效运行和决策准确的重要环节。随着物联网设备数量的增加和数据量的爆炸式增长&#xff0c;开发者和决策者们需要选择…

了解RSA和DSA的联系和区别

引言 在信息安全领域&#xff0c;加密算法起着至关重要的作用。RSA&#xff08;Rivest-Shamir-Adleman&#xff09;和DSA&#xff08;Digital Signature Algorithm&#xff09;是两种常见的公钥加密算法&#xff0c;它们在网络安全领域具有重要的应用价值。本文将对比分析RSA和…

项目管理体系文档,代码评审规范文档,代码审查,代码走查标准化文档(word原件)

1.代码评审(Code Review)简介 1.1Code Review的目的 1.2Code Review的前提 1.3.Code Review需要做什么 1.3.1完整性检查&#xff08;Completeness&#xff09; 1.3.2一致性检查&#xff08;Consistency&#xff09; 1.3.3正确性检查&#xff08;Correctness&#xff09; …

前端算法:树(力扣144、94、145、100、104题)

目录 一、树&#xff08;Tree&#xff09; 1.介绍 2.特点 3.基本术语 4.种类 二、树之操作 1.遍历 前序遍历&#xff08;Pre-order Traversal&#xff09;&#xff1a;访问根节点 -> 遍历左子树 -> 遍历右子树。 中序遍历&#xff08;In-order Traversal&#xf…

Webserver(5.3)线程池实现

目录 线程池locker.hthreadpool.h 线程池 相比于动态地创建子线程&#xff0c;选择一个已经存在的子线程的代价显然要小得多。至于主线程选择哪个子线程来为新任务服务&#xff0c;有多种方式&#xff1a; 主线程使用某种算法来主动选择子线程。最简单、最常用的算法是随机算…

02_ElementUI

一.前端工程化 1.1 概述 前端工程化是使用软件工程的方法来单独解决前端的开发流程 中模块化、组件化、规范化、自动化的问题,其主要目的为了 提高效率和降低成本。 1.2 NodeJS的安装 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环 境&#xff0c;可以使 JavaS…

从无音响Windows 端到 有音响macOS 端实时音频传输播放

以下是从 Windows 端到 macOS 端传输音频的优化方案&#xff0c;基于上述链接中的思路进行调整&#xff1a; Windows 端操作 安装必要软件 安装 Python&#xff08;确保版本兼容且已正确配置环境变量&#xff09;。安装 PyAudio 库&#xff0c;可通过 pip install pyaudio 命令…

SpringBoot实现的企业资产管理系统

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

建筑行业智慧知识库的搭建与运用

一、引言 在建筑领域&#xff0c;知识管理是企业持续发展和提升竞争力的关键所在。智慧知识库的构建&#xff0c;不仅能够促进知识的有效传递与共享&#xff0c;还能为项目管理和决策提供有力支持。本文将重点探讨建筑行业智慧知识库构建的价值、实践路径以及需要注意的关键点…

开源 - Ideal库 - 常用时间转换扩展方法(二)

书接上回&#xff0c;我们继续来分享一些关于时间转换的常用扩展方法。 01、时间转日期时间 TimeOnly 该方式是把TimeOnly类型转为DateTime类型&#xff0c;其中日期部分使用系统当前日期&#xff0c;时间部分则使用TimeOnly&#xff0c;具体代码如下&#xff1a; //时间转日…