C语言基础——指针(4)

news2024/12/24 8:54:12

一.    字符指针变量
       字符指针变量的使用和整型指针变量的使用方法相似,以下是其基本使用方法的例子:
 358e20ab84944910a78a798187fa162d.png
(1)字符指针变量还有一种使用方法:
                   const char* p = "abcd"
需要注意的是,这里并不是把字符串abcd放到了指针变量p中,而是只将这个字符串中的第一个元素的地址赋给了p,我们可以用下面这个代码来理解:
                   char arr[] = "abcd";
                   char* ch = arr;
                   printf("%c", *ch);
ch这个指针变量实际存放的是数组中首元素a的地址。



(2)const char* p = "abcd";用%s打印这个字符串的时候,只需要提供首元素的地址即可。
 

92726715fd8049408fd62e5a82692315.png


(3)const char* p = "abcd"这是一个常量字符串,意味着里面的内容不能修改


(4)在c语言中,用相同的字符串去初始化不同的数组时,会开辟出不同的空间:但是,用不同的指针指向同一个字符串时,其实会指向同一块空间,我们用两个代码来验证:
 
 6c7c48010ec7446ba0e23e611cf6f7f8.png


316f4107dda94bef86b5aec62b2e1316.png



二.    数组指针变量
       整型指针变量时存放整型变量的地址,字符指针变量是存放字符变量的地址,那么同理,数组指针变量是存放数组的地址。
       在介绍数组指针前,我们需要区分一下数组指针和指针数组,在前面的学习中,我们已经了解了指针数组,它其实是存放指针的数组,而数组指针正好相反,它是存放数组地址的指针。在记忆上,可以着重记忆后面两个字,指针数组它的重点是数组,而数组指针它的重点是指针。


以下是数组指针变量写的方式:
                            int (*p)[5];
理解的时候,我们可以按照以下顺序来理解:
       *先和p结合,说明变量p是一个指针变量——变量p指向它后面的内容,在这里指向的是一个大小为5的数组——这个数组的类型为整型。
       我们知道,数组名就是数组首元素的地址,而&数组名,就是整个数组的地址了。在对数组指针变量初始化的时候,我们就可以用&数组名来操作:
                     int (*p)[5]=&arr;



为了更灵活的应用,我们将char * ch[5] 放入数组指针中去:
              char *(*pch)[5]=char * ch[5]
和上面的理解方式相同:*与pch结合,表示pch是一个指针变量,这个指针变量指向一个大小为5的数组,而这个数组的类型为char*。



下面,我们用数组指针变量的内容来打印一个数组:
int main()
{
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int (*p)[10] = &arr;
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", (*p)[i]);
    }
    return 0;
}
注意:*p将p这个指针变量解引用,代表的是数组arr,也就等价于arr[i];arr[i]又等价于          *(arr+i),这样更有助于我们理解二维数组传参。




三.    二维数组传参的深入理解
二维数组可以看作每个元素是一维数组的数组,二维数组的首元素就是第一行,是一个一维数组。所以,二维数组的数组名表示的就是第一行的地址,二维数组传参本质上就是传递了第一行的一维数组的地址,假设我们要打印一个二维数组,代码如下:
void print(int (*p)[5], int a, int b)
{
    for (int i = 0; i < a; i++)
    {
        for (int j = 0; j < b; j++)
        {
            printf("%d ", *(*(p + i) + j));
        }
        printf("\n");
    }
}
int main()
{
    int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
    print(arr, 3, 5);
    return 0;
}
 d59e05d18b0a4a7aae671ffe765cca1b.png



以下是对这段代码中重点内容的解释:
(1)由于二维数组传参传过去的是第一行的一维数组的地址,那么在接收参数时,就应该用数组指针变量的形式来写,也就是int(*p)[5]。
(2)*(*(p + i) + j)
我们从内向外依次来解释理解:

由于p存放的是一个一维数组的地址,那么p+i表示的就是每加i就跳过一个一维数组,用*(p+i)的方式来找这个二维数组中的每一个一维数组,*(p+i)可以看作一个一维数组arr1;*(*(p + i) + j)就可以看作 *(arr1+j),而这又等价于arr1[j],这样就可以理解二维数组的传参了。



 

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

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

相关文章

『 Linux 』高级IO (一)

文章目录 内容回顾及铺垫五种IO模型不同类型IO的区别非阻塞IOfcntl( ) 多路转接 - select( )select( ) 的基本使用 - SelectServer服务器 内容回顾及铺垫 在博客『 Linux 』基础IO/文件IO (万字)中介绍了对IO的认识; IO实际上为Input/Output,输入输出; 以网络协议栈的视角来看,…

Spark-Streaming集成Kafka

Spark Streaming集成Kafka是生产上最多的方式&#xff0c;其中集成Kafka 0.10是较为简单的&#xff0c;即&#xff1a;Kafka分区和Spark分区之间是1:1的对应关系&#xff0c;以及对偏移量和元数据的访问。与高版本的Kafka Consumer API 集成时做了一些调整&#xff0c;下面我们…

「下载」智慧城市包括哪些方面:大数据公共服务平台、城市运行指挥中心、城市综合治理平台、城市体检综合运营平台解决方案

在当今信息化高速发展的时代&#xff0c;智慧城市已成为全球城市发展的新趋势。系列全面而创新的智慧城市解决方案&#xff0c;旨在助力城市实现智慧化转型&#xff0c;提升城市管理效率&#xff0c;增强市民生活质量。 智慧城市最新解决方案&#xff0c;标准规范顶层设计指南、…

ChatGPT生成接口文档实践案例(二)

不难发现&#xff0c;两个方案都出色地完成了接口文档的生成&#xff0c;但笔者更喜欢Response 2的表达&#xff0c;因为其描述更加全面。 还可以让ChatGPT生成符合OpenAPI 3.0规范的接口文档&#xff0c;以便于项目相关成员阅读&#xff0c;如图5-13所示。 为什么要生成OpenAP…

【解决】Linux更新系统内核后Nvidia-smi has failed...

问题概述 由于服务器(操作系统为 RedHat 9)宕机&#xff0c;重启后&#xff0c;系统内核自动更新了&#xff0c;然后输入 nvidia-smi 发现报了下面的异常&#xff1a; NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver. Make sure that the late…

Docker Compose 安装 Harbor

我使用的系统是rocky Linux 9 1. 准备环境 确保你的系统已经安装了以下工具&#xff1a; DockerDocker ComposeOpenSSL&#xff08;用于生成证书&#xff09;#如果不需要通过https连接的可以不设置 1.1 安装 Docker 如果尚未安装 Docker&#xff0c;可以参考以下命令安装&…

PCIe_Host驱动分析_设备枚举

往期内容 本文章相关专栏往期内容&#xff0c;PCI/PCIe子系统专栏&#xff1a; 嵌入式系统的内存访问和总线通信机制解析、PCI/PCIe引入 深入解析非桥PCI设备的访问和配置方法 PCI桥设备的访问方法、软件角度讲解PCIe设备的硬件结构 深入解析PCIe设备事务层与配置过程 PCIe的三…

【CVE-2024-53375】TP-Link Archer系列路由器认证操作系统命令注入(内附远离和代码利用)

CVE-2024-53375 TP-Link Archer系列路由器认证操作系统命令注入 受影响的设备 使用 HomeShield 功能的 TP-Link 设备容易受到此漏洞的影响。这包括 TP-Link Archer 系列的多款路由器。 经过测试 Archer AXE75(EU)_V1_1.2.2 Build 20240827(发布日期 2024 年 11 月 4 日)…

SpringBoot 自动装配原理及源码解析

目录 一、引言 二、什么是 Spring Boot 的自动装配 三、自动装配的核心注解解析 3.1 SpringBootApplication 注解 &#xff08;1&#xff09;SpringBootConfiguration&#xff1a; &#xff08;2&#xff09;EnableAutoConfiguration&#xff1a; &#xff08;3&#xf…

2025系统架构师(一考就过):案例题之一:嵌入式架构、大数据架构、ISA

一、嵌入式系统架构 软件脆弱性是软件中存在的弱点(或缺陷)&#xff0c;利用它可以危害系统安全策略&#xff0c;导致信息丢失、系统价值和可用性降低。嵌入式系统软件架构通常采用分层架构&#xff0c;它可以将问题分解为一系列相对独立的子问题&#xff0c;局部化在每一层中…

单片机上电后程序不运行怎么排查问题?

1.电源检查。使用电压表测量单片机的电源电压是否正常&#xff0c;确保电压在规定的范围内&#xff0c;如常见的5V。 2.复位检查。检查复位引脚的电压是否正常&#xff0c;在单片机接通电源时&#xff0c;复位引脚通常会有一个高电平&#xff0c;按下复位按钮时&#xff0c;复位…

初学stm32 --- 外部中断

目录 STM32 IO 口中断基础知识 相关库函数&#xff1a; 使用 IO 口外部中断的一般步骤 STM32 IO 口中断基础知识 STM32 的每个 IO 都可以作为外部中断的中断输入口。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位&#xff0c;每个中断/事件都有独立…

c++------------------函数

函数定义 语法格式 函数定义包括函数头和函数体。函数头包含返回类型、函数名和参数列表。函数体是用花括号{}括起来的代码块&#xff0c;用于实现函数的功能。例如&#xff0c;定义一个计算两个整数之和的函数&#xff1a; int add(int a, int b) {return a b; }这里int是返回…

【java基础系列】实现一个简单的猜数字小游戏

主要是用的java中的键盘录入和随机数两个api&#xff0c;实现这种人机交互的小游戏&#xff0c;可以用来锻炼基础算法思维 实现效果 实现代码 package com.gaofeng.day10;import java.util.Random; import java.util.Scanner;/*** author gaofeng* date 2024-12-22 - 9:21*/ …

helm的介绍和安装

1 helm概述 1.1 资源对象难以管理的问题 helm是k8s资源清单的管理工具&#xff0c;它就像Linux下的包管理器&#xff0c;比如centos的yum&#xff0c;ubuntu的apt helm&#xff1a;命令行工具&#xff0c;主要用于k8s的chart的创建&#xff0c;打包&#xff0c;发布和管理。…

AI,cursor快速上手思维导图

https://cursor101.com/zh/tutorial/learn-cursor-tab

ESP32S3 使用LVGL驱动LCD屏(ST7789主控)

ESP32S3 使用LVGL驱动LCD屏&#xff08;ST7789主控&#xff09; 目录 1 分析原理图 2 驱动、点亮LCD(ST7789) 2.1 在工程中添加目录、文件 2.2 添加esp_lvgl_port组件 2.3 对工程进行必要的配置 2.4 编写必要代码 3 烧录、验证 1 分析原理图 要使用SOC驱动LCD屏&#…

【hackmyvm】Zday靶机wp

HMVrbash绕过no_root_squash静态编译fogproject 1. 基本信息^toc 这里写目录标题 1. 基本信息^toc2. 信息收集2.1. 端口扫描2.2. 目录扫描 3. fog project Rce3.1. ssh绕过限制 4. NFS no_root_squash5. bash运行不了怎么办 靶机链接 https://hackmyvm.eu/machines/machine.ph…

neo4j console 报错

项目场景&#xff1a; neo4j 开启失败 问题描述 在终端打开 neo4j 失败打开cmd, 输入: neo4j console 报错 原因分析&#xff1a; 1 可能是没有配置环境变量2 当前脚本的执行策略有问题 解决方案&#xff1a; 解决没有配置环境变量 添加环境变量 在path路径中将变量添加进去…

范德蒙矩阵(Vandermonde 矩阵)简介:意义、用途及编程应用

参考&#xff1a; Introduction to Applied Linear Algebra – Vectors, Matrices, and Least Squares Stephen Boyd and Lieven Vandenberghe 书的网站: https://web.stanford.edu/~boyd/vmls/ Vandermonde 矩阵简介&#xff1a;意义、用途及编程应用 在数学和计算科学中&a…