知识重复

  • 变量指针:变量最小的地址值(首地址),本质是地址、指针

  • 指针变量:存储指针的变量,本质是变量

  • &:取地址运算符(取址符、取地址符),获取变量、数组等的地址

  • *:指针操作符,如果这个符号前面有数据类型,就被称为“指针声明符”,如果没有数据类型,就被称为“解引用符”

  • 指向:指针变量存储了谁的地址,这个指针变量就指向了谁

  • 交换指向:指向发生改变,指向对象的数据不会改变

  • 交换数据:指向不发生改变,指向对象的数据会改变

  • 指针变量本质上还是变量,只不过指针变量只能存储其他内存单元的地址,我们借助于指针变量,就能实现内存空间的共享

  • 共享他人空间:

    int a = 10;
    int *p = &a;
    int *q = p;
    
  • 共享自己的空间:

    int a  = 10;
    int *p = &a;  //a和p共享a的空间
    

指针数组和数组指针

数组指针

定义
  • 概念:数组指针是指向数组的指针(指针变量),本质上还是指针

指针变量指向数组元素和数组指针的区别:
在这里插入图片描述

特点

  • ①先有数组,再有指针
  • ②它指向的是一个完整的数组

一维数组指针

语法

数据类型 (*指针变量名)[容量];

案例

在这里插入图片描述

我们之前所学的是指向数组元素的指针,本质上是指针变量;现在我们学的是指向数组的指针,叫做数组指针

二维数组指针

语法:

数据类型 (*指针变量名)[行容量][列容量];

案例1

//写法1:二维数组指针指向二维数组----不推荐
#include <stdio.h>
int main()
{//创建一个二维数组int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};//定义一个二维数组指针指向二维数组int (*p)[][3] = &arr;//遍历数组for(int i = 0;i < 3; i++){for(int j = 0;j < 3; j++){printf("%-6d",(*p)[i][j]);}}printf("\n");//写法2:一维数组指针指向二维数组-----推荐//创建一个二维数组int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};    //定义一个一维数组指针指向二维数组,相当于指针指向的是二维数组的行[行容量]int (*p)[3] = arr;//等价于&arr[0] (*p):指向数组的行   int arr[] = {100,200,300};  int *p = arr;  解引用p得到第一个元素//遍历数组for(int i = 0;i < 3; i++){for(int j = 0;j < 3; j++){printf("%-6d",(*p)[i][j]);}}printf("\n");    return 0;
}

案例2

/*
**指向一维数组的指针
*/#include <stdio.h>int t_pl()
{//创建一个一维数组int arr[] = {10,20,30,40,50};//计算数组大小int len = sizeof(arr) / sizeof(arr[0]);//创建一个数组指针指向一维数组arrint (*p)[len] = &arr;//借助数组指针遍历数组for(int i = 0; i < len; i++){//p 指向数组arr,p存储了数组arr的地址,如果要通过指针访问数组,就要对地址解引用(*p), *和[]在一起,[]的优先级大于*printf("%-4d", (*p)[i]);}printf("\n");
}/*
**指向二维数组的指针
*/int t_p2()
{//创建一个二维数组int arr[][3] = {{10,20,30},{100,2200,300},{1000,2000,3000}};//获取行和列的容量int row_len = sizeof(arr) / sizeof(arr[0]);int col_len = sizeof(arr[0]) / sizeof(arr[0][0]);//方式1(不推荐)  二维数组指针指向二维数组int (*p)[][3] = &arr;//遍历数组for(int i = 0;i < row_len; i++){for(int j = 0; j < col_len; j++){printf("%-6d", (*p)[i][j]);   } }printf("\n");//方式2(推荐)  一维数组指针指向二维数组,本质上是一维数组指针指向二维数组的行(默认首行)//&arr:获取该二维数组的地址,范围作用于整个数组//arr:数组名,默认指向第一个元素,这个就是行,默认首行,范围作用于整个行,等价于&arr[0]//数组参与指针运算,会降级为指针int (*p1)[3] = &arr[0];for(int i = 0; i < row_len;i++){for(int j = 0; j < col_len; j++){printf("%-6d", p1[i][j]);printf("%-6d", (*(p1+i))[j]);printf("%-6d", *(p1[i]+j));//列偏移printf("%-6d", *(*(p1+i)+j));}}printf("\n");    
}int main()
{return 0;
}

数组指针和指针数组

数组指针

指针和数组中符号优先级
() > [] > *
通过指针引用二维数组
int arr[][] = {{2000},{},{}};
表示形式含义地址/值
arr二维数组名,指向一维数组的arr[0],0行首地址2000
arr[0],*****(arr + 0),*arr0行0列元素地址,数组降级指针2000
arr + 1,&arr[1]1行首地址2008
arr[1],*(arr + 1)1行0列元素a[1] [0]的地址2008
arr[1]+2,*(arr + 1)+2,&arr[1] [2]1行2列元素a[1] [2]的地址2012
* (a[1]+2), * (* (arr+1)+2),arr[1] [2]1行2列元素a[1] [2]的值元素值为13

注意:二维数组中,数组整体的地址值 == 数组中0行元素的地址值 == 数组中0行0列元素的地址值

在这里插入图片描述

案例1
  • 用指向元素的指针变量输出二维数组元素的值

    #include <stdio.h>int mian()
    {//定义一个二维数组int arr[3][4] = {10,20,30,40,100,200,300,400,1000,2000,3000,4000};//定义一个指针变量,用来指向数组中的元素int *p = arr[0];//获取元素个数  行容量 * 列容量int len = (sizeof(arr) /sizeof(arr[0])) * (sizeof(arr[0]) / sizeof(arr[0][0]));//使用单层for循环遍历二维数组,列偏移for(; p < arr[0] + len; p++){//每四个一行  if((p - arr[0]) % 4 == 0 && p != arr[0])printf("\n"); printf("%-6d", *p); }printf("\n");return 0;
    }
    
案例2
  • 数组指针输出二维数组任意行任意列的元素的值

    在这里插入图片描述

指针数组

  • 定义:指针数组是一个数组,数组中每一个元素都是一个指针。

  • 特点:

    • 先有指针,后有数组
    • 指针数组的本质是一个数组,只是数组中的每一个元素是指针
  • 语法:

    数据类型 *数组名[容量];
    
案例
#include <stdio.h>int main()
{//定义三个变量int a = 10, b = 20, c = 30;//定义指针数组:先有指针,后有数组、int *arr[3] = {&a, &b, &c};//获取大小int len = sizeof(arr) / sizeof(arr[0]);//遍历数组for(int i = 0; i < len; i++){printf("%-3d", *arr[i]);  }printf("\n");return 0;
}
  • 建议:我们一般使用指针数组处理字符串,后续专门讲解
数组指针与指针数组的区别
对比项指针数组数组指针
定义数组元素均为指针的数组指向一个完整数组的指针
存储内容存储多个指针,每个元素指向不同的内存地址存储单个指针,指向一个完整的数组(首地址)
内存分配每个指针元素独立分配内存,可能分散指向的数组内存连续的,指针本身存储数组首地址
语法实例int *arr[5] 元素为5个int *指针int (*arr) [5] 指向5个int的数组的指针
访问方式通过下标访问指针元素,再解引用 *arr[i]先解引用指针得到数组,再访问元素 (*arr) [i]
使用场景管理多个独立指针(如字符串数组、动态结构体数组)操作多维数组(如传递二维数组的行指针)
内存布局[ptr1] --> 数据1 [ptr2] --> 数据2 …ptr --> [数据1] [数据2]…
示例代码int a = 1,b = 2;int *arr[] = {&a,&b};int arr[2] [3] = {1,2,3,4,5,6};int (*ptr)[3] = arr;

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NX982NX984美光固态闪存NX992NY102

NX982NX984美光固态闪存NX992NY102技术革新引领存储革命——深度拆解美光NX系列固态闪存在数字化浪潮席卷全球的当下&#xff0c;数据存储已成为支撑人工智能、云计算与物联网等前沿领域的核心基础设施。作为行业标杆企业&#xff0c;美光科技推出的NX系列固态闪存产品&#xf…

Elasticsearch 集群管理核心 API 指南:健康、状态、分片诊断与运维实战

一、集群健康状态 API (_cluster/health) 获取集群的总体健康状况&#xff0c;是监控的首要指标。 GET http://192.168.130.61:9200/_cluster/health响应字段解析 curl http://192.168.130.61:9200/_cluster/health 2>/dev/null |jq {"cluster_name": "E…

Three.js 与 WebXR:初识 VR/AR 开发

引言 WebXR 是现代 Web 技术的重要组成部分&#xff0c;允许开发者通过浏览器创建虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;体验。结合 Three.js 的强大渲染能力&#xff0c;WebXR 可以轻松构建沉浸式 3D 场景。本文将介绍如何使用 Three.js 和…

Kubernetes架构概览

目录 专栏介绍 作者与平台 您将学到什么&#xff1f; 学习特色 Kubernetes架构概览 1.1 Kubernetes简介 1.2 基本架构 1.3 主要组件 1.4 核心功能 组件架构图解 2.1 控制平面组件详解 2.1.1 kube-apiserver 2.1.2 etcd 2.1.3 kube-scheduler 2.1.4 kube-controll…

前端技术栈查缺补漏

前端技术栈涵盖广泛&#xff0c;涉及多个领域和技术方向。以下是全面的分类总结&#xff0c;帮助你对前端技术生态有系统化的了解&#xff1a;一、核心基础HTML/CSS HTML5&#xff08;语义化标签、Web Components&#xff09;CSS3&#xff08;Flexbox/Grid、动画、变量、BEM/SM…

文明7|席德·梅尔的文明VII PC/手机双端 模拟器版(Sid Meier’s Civilization VII)免安装中文版

网盘链接&#xff1a; 文明7|席德梅尔的文明VII 免安装中文版 名称&#xff1a;文明7|席德梅尔的文明VII PC/手机双端 模拟器版 免安装中文版 描述&#xff1a;这款策略神作重新定义了"历史蝴蝶效应"&#xff01; 《文明7》的"文明基因"系统让每个选择都刻…

C#模式匹配用法与总结

1. 模式匹配概述​​ 模式匹配是C# 7.0引入的机制&#xff0c;用于检查数据的类型、值或结构&#xff0c;并提取信息。通过is表达式、switch语句/表达式实现&#xff0c;显著简化条件逻辑&#xff0c;提升代码可读性和安全性。 ​​核心优势​​&#xff1a; ​​简洁性​​&…

修改git commit 提交版本的描述信息

1 修改最后一次提交&#xff08;未推送到远程仓库&#xff09; 适用场景&#xff1a;提交仅存在于本地&#xff0c;尚未执行 git push 操作步骤&#xff1a;git commit --amend -m "新的正确备注"原理&#xff1a;–amend 会合并新的修改到上一次提交&#xff0c;并允…

PyQt GUI开发初学者:固定尺寸还是全屏自适应?

PyQt GUI开发初学者&#xff1a;固定尺寸还是全屏自适应&#xff1f;在PyQt GUI开发中&#xff0c;新手常常面临一个选择&#xff1a;是应该为应用程序设置固定尺寸&#xff0c;还是采用全屏自适应设计&#xff1f;这个决定不仅关乎用户体验&#xff0c;还影响开发效率和应用的…

量子图灵机 Quantum Turing Machine, QTM

量子图灵机&#xff08;Quantum Turing Machine, QTM&#xff09;是经典图灵机&#xff08;Turing Machine, TM&#xff09;在量子计算框架下的推广&#xff0c;它利用量子力学原理&#xff08;如叠加态、纠缠和幺正演化&#xff09;扩展了计算能力。下面对量子图灵机进行解析。…

用于 UBI 的 Elasticsearch 插件:从搜索查询中分析用户行为

作者&#xff1a;来自 Elastic Eduard Martin 想获得 Elastic 认证&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间&#xff01; Elasticsearch 拥有丰富的新功能&#xff0c;帮助你为你的使用场景构建最佳搜索解决方案。深入查看我们的示例笔记本以了解更多信息&a…

python的蛋糕店管理系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具&#xff1a;Navicat/SQLyog等都可以 该系统通…

开源项目:排序算法的多种实现方式

以 排序算法 为例&#xff0c;展示如何在 Python 中进行不同实现方式的对比项目概述本项目旨在通过 Python 实现几种经典的排序算法&#xff0c;并通过性能对比、代码注释和优化手段&#xff0c;为开源社区提供参考。选择排序、冒泡排序、快速排序和归并排序作为主要算法&#…

操作系统数据格式相关(AI回答)

二进制接口&#xff08;ABI&#xff09; DeepSeek-R1 回答完成 深度思考完成 用时20秒&#xff0c;搜索全网24篇资料 二进制接口&#xff08;ABI&#xff0c;Application Binary Interface&#xff09;是计算机系统中定义二进制层面交互规则的低层接口规范&#xff0c;确保不…

从入仓到结算全自动化:易境通如何重构散货拼柜业务流程?

在全球贸易蓬勃发展的今天&#xff0c;海运拼箱&#xff08;LCL&#xff09;凭借成本低、灵活性强的优势&#xff0c;成为中小货主、跨境电商和国际贸易企业的首选物流方式。然而&#xff0c;散货拼柜业务涉及多货主、多环节、多流程&#xff0c;传统管理方式存在信息不透明、效…

CAP 理论笔记

一、CAP 理论概述 CAP 理论由 Eric Brewer 于 2000 年提出&#xff0c;并在 2002 年被正式证明。它描述了分布式系统在 一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;、分区容忍性&#xff08;Partition Tolerance&#xff09; 三个…

Android 底层实现基础

Activity 生命周期应用内 Activity 跳转流程&#xff08;A → B&#xff09; 从 Activity A 打开新的 Activity B&#xff08;如点击按钮跳转详情页&#xff09; A.onCreate() → A.onStart() → A.onResume() &#xff08;A 已在前台&#xff09;点击跳转按钮 → A.onPause() …

MySQL进阶:(第一篇) 深入解析MySQL存储引擎架构

一、MySQL的体系结构连接层&#xff1a;最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层&#xff1a;第二层架构主要完成大多数的核心服务功能&#xff0c…

京东m端 滑块 分析 t30

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;部分python代码response requests.pos…

CentOS使用命令行工具为其配置静态网络并使用VMware软件ovf配置文件快速配置多台不同ip的centos文件

目录 一、实验前准备 1.SSH远程登录工具 二、CentOS配置静态IP并实现远程ssh登录 1.VMware软件查看NAT模式下默认网段和网关 2.使用ipconfig查看当前网卡名字和动态分配的ip地址 3.使用VIM编辑网络配置文件&#xff08;此步骤可有其他编辑器替代&#xff0c;例如&#xf…