C语言基础(六)

news2024/10/7 12:17:24

C语言基础

  • 指针与一维数组
    • 总结
  • * p++、* (p++)、(\*p)++、* ++p、*(++p)、++*p区别和用法
    • 运算优先级
    • ++p与p++区别
      • *p++与 *(p++)与(*p)++
      • *++p与 *(++p)与 ++*p
  • 指针常量与一维数组的关系
  • 指针变量与一维数组的关系
    • 数组在子函数中弱化为指针
  • 指针常量与二维数组的关系
  • 数组指针
    • 定义
    • 数组指针与一维数组的关系
    • 数组指针与二维数组的关系
  • 指针数组
    • 定义
    • 指针数组与二维数组关系

指针与一维数组

指针+1,加到哪里?加多大?

  • 指针常量算术运算的偏移量取决于指针指向的数据类型大小
    在这里插入图片描述

总结

  • p+n:相当于指针p向地址增大方向移动n个数据(数据大小=sizeof(指向的数据类型)),p可以为指针常量或者指针变量
  • p-n:相当于指针p向地址减小方向移动n个数据(数据大小=sizeof(指向的数据类型)),p可以为指针常量或者指针变量
  • p++:指针p向地址增大方向移动1个数据(数据大小=sizeof(指向的数据类型)),p为指针变量
  • p–:指针p向地址减小方向移动1个数据(数据大小=sizeof(指向的数据类型)),p为指针变量
  • p-q:(p和q的指针类型需要匹配)两个指针之间相差的数据个数(十六进制p-q的差值)/sizeof(指向的数据类型)
    在这里插入图片描述
    注意:
    1、指针的算术运算需要操作连续的空间地址才有意义
    2、p是指针变量,可以++或者–(指针常量不可)

* p++、* (p++)、(*p)++、* ++p、*(++p)、++*p区别和用法

运算优先级

  • *与++两种运算符的优先级相同,都是从右向左结合
    在这里插入图片描述

在这里插入图片描述

++p与p++区别

++p:先自增再取值
p++:先取值再自增

*p++与 *(p++)与(*p)++

  • *p++
    1、按从右至左的运算顺序结合,p先与++结合
    2、又因p++,是先赋值后++,因此p先与*结合
    3、先取值 * p ,之后再对p++做自增操作

在这里插入图片描述

  • *(p++)
    1、先算小括号里面,p先与++结合
    2、又因p++,是先赋值后++,因此p先与*结合
    3、先取值*p,之后再对p++做自增操作
    在这里插入图片描述
  • (*p)++
    1、因括号优先级高,先算括号内,先取值*p
    2、然后再对取出的值加1
    在这里插入图片描述

*++p与 *(++p)与 ++*p

  • *++p
    1、从右至左结合,先++p,对指针p先自加,指向下一个地址
    2、再取值
    在这里插入图片描述
  • ++*p
    1、先与*结合,先取值
    2、再对所取的值进行加1
    在这里插入图片描述
  • *(++p)
    1、先小括号,对指针p,先自增
    2、再取值
    在这里插入图片描述
    eg:
    在这里插入图片描述

指针常量与一维数组的关系

在这里插入图片描述
在这里插入图片描述
不可以对指针常量++
在这里插入图片描述

指针变量与一维数组的关系

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

printf有表达式的时候,为右结合原则
当i=0时,右结合原则,*(p++)先小括号,但p++是先赋值后自加,即先取值p=1,后p加加指向arr[1];*(p+i)为arr[1]的值为2;p[i]为2;arr[0],(arr+i)正常输出;当前p指向arr[1];
当i=1时,右结合原则,*(p++)先小括号,但p++是先赋值后自加,即先取值p=2,后p加加指向arr[2];*(p+i)为arr[3]的值为4;p[i]为4;arr[0],(arr+i)正常输出;当前p指向arr[3];
当i=2时,右结合原则,*(p++)先小括号,但p++是先赋值后自加,即先取值p=3,后p加加指向arr[3];*(p+i)越界;p[i]为越界;arr[0],(arr+i)正常输出;

数组在子函数中弱化为指针

void input(int *p, int m)
//可以在子函数中像main函数一样操作数组,操作的是同一片地址
void input(int a[], int m)
void input(int a[100], int m)

指针常量与二维数组的关系

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:

  1. a,&a,a[0],&a[0],&a[0] [0],值都是相同的(都是首地址),但其意义不同
    a(指针常量——整个二维数组名) 数据类型是 int(*)[3] 此时a这个指针常量指向一维数组a[0]
    a[0] (指针常量——整个一维数组名) 数据类型int * 此时a[0]这个指针常量指向a[0] [0]
  2. 为什么a不是int**类型?
    a[0]是int *类型,指向是一个int类型,如果是二级指针,a+1移动4/8字节,实质上发现移动12字节,
    此时证明a不是二级指针
  3. a指向a[0],a[0]指向a[0] [0]

数组指针

本质:指针
概念:指向数组的指针

定义

<存储类型> 数据类型 指针名;
int (*p)[3];

  • p先跟*结合,表示p的本质是一个指针
  • 数据类型:p所指向的数组里面的元素的数据类型

数组指针p的数据类型:int () [3]
数组指针p指向的数据类型:int [3]
tip: []的优先级高于
的优先级
p先和*结合,*代表指针,此时这就是一个数组指针
p先和[]结合,[]代表数组,此时这就是一个指针数组

数组名p

  1. 数组首元素地址 int * (地址常量)
  2. 整个数组 int [3] (变量)

数组指针与一维数组的关系

在这里插入图片描述
在这里插入图片描述
数组指针对其+1,直接移动一整个一维数组,指向数组底部,容易产生数组越界问题,因此一般不使用数组指针操作一维数组。

在这里插入图片描述

数组指针与二维数组的关系

在这里插入图片描述
在这里插入图片描述

指针数组

本质:数组
概念:由指针组合起来的数组,数组中的元素都是指针类型

定义

<存储类型> 数据类型 数组名[元素个数];
int* a[3];
//a先跟[]结合,表示a的本质是一个数组
//数据类型:a数组中的元素的数据类型

指针数组a的数据类型:int* [3]
指针数组保存的数据类型:int*

在这里插入图片描述
在这里插入图片描述

指针数组与二维数组关系

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

基于FIDO2和USBKEY硬件的SSH认证

在 8.2&#xff08;最新为 8.3&#xff09;版本中&#xff0c;OpenSSH 提供了对 FIDO 和 UAF 的支持。从此用户就可以用硬件 USBKEY 证书进行 SSH 原生认证。这样可以实现简捷、有效和安全的 SSH 认证。本文我们就就少一下 FIDO2 以及 OpenSSH 对其的支持&#xff0c;并尝试一下…

十大排序 —— 冒泡排序

十大排序 —— 冒泡排序 什么是冒泡排序基本步骤特点 优化冒泡的各项性能时间复杂度空间复杂度稳定性总结 我们今天来讲一个大家熟悉的老朋友——冒泡排序&#xff1a; 什么是冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;因其工作…

【大模型部署】在C# Winform中使用文生图Stable Diffusion XL 模型

【大模型部署】在C# Winform中使用文生图Stable Diffusion XL 模型 前言 整了一个在C# Winform中调用文生图Stable Diffusion XL的小程序&#xff0c;基于百度智能云千帆平台 步骤 如何注册百度智能云和创建应用&#xff0c;获取API 密钥等和在之前的博客中基本相同&#…

单日收益1000+看了就会的项目,最新灵异短视频项目,简单好上手可放大操作

各位好友&#xff0c;佳哥在此与大伙儿聊聊一项神秘莫测的短视频项目。你或许会想&#xff0c;“又是一个视频创作项目&#xff1f;” 但别急&#xff0c;这个项目与众不同&#xff0c;日入千元不再是梦&#xff0c;而且它的易用性让人惊喜&#xff0c;无论你是初学者还是资深玩…

面向对象------多态

1.多态的定义 通俗来说&#xff0c;当同一种行为或者事情发生在不同的对象上&#xff0c;这些行为或者事情最终得到的结果不同。 注意&#xff1a;多态要发生在继承的基础上。 例如&#xff1a;彩色打印机和黑白打印机。 彩色打印机和黑白打印机是不同的对象&#xff0c;但…

兵器室管控系统|DW-306是一套成熟系统

概述 智慧兵器室管理系统&#xff08;DW-S306&#xff09;是依托互3D技术、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 本解决方案利用现有内部网络&#xff0c;部署部队智能兵器室管理系统&#xff…

Python并发编程学习记录

1、初识并发编程 1.1、串行&#xff0c;并行&#xff0c;并发 串行(serial)&#xff1a;一个cpu上按顺序完成多个任务&#xff1b; 并行(parallelism)&#xff1a;任务数小于或等于cup核数&#xff0c;多个任务是同时执行的&#xff1b; 并发(concurrency)&#xff1a;一个…

小浪助手下载学浪视频的简单步骤

你是否想轻松下载学浪高清视频&#xff1f;快来尝试小浪助手&#xff0c;这是你不可错过的下载神器&#xff01;简单几步操作&#xff0c;即可轻松下载你所需的学浪视频&#xff0c;节省时间&#xff0c;提高效率&#xff01; 首先我已经打包好了小浪助手&#xff0c;有需要的…

DOS学习-目录与文件应用操作经典案例-attrib

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 一.前言 DOS系统中的attrib命令是一个用于显示或更改文件&#…

内网渗透—SMB隧道正反向连接防火墙规则绕过CS上线

1、前言 这篇文章主要是说一下这个用于横向移动的SMB隧道&#xff0c;已经如何使用smb隧道去进行横向移动。 2、实验环境 实验环境和上一篇的差不多&#xff0c;主要是加了个防火墙。 windows server2012 192.168.145.131&#xff08;外网&#xff09; 192.168.22.134&…

【NumPy】关于numpy.flatten()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

头晕、心悸…你们小年轻配不上张俊杰的霸王茶姬,还要奔上市

近日&#xff0c;有多名网友在社交平台反映称&#xff0c;自己在喝了霸王茶姬的新品“万里木兰”奶茶后&#xff0c;出现了失眠、头晕、心悸等不同程度的不适症状&#xff0c;霸王茶姬方面则表示“可能是茶多酚过敏”。 而就在几天前举行的“2024年国际茶日现代东方茶创新论坛…

全局光照技术在AI去衣中的革命性角色

引言&#xff1a; 随着计算机视觉和深度学习技术的飞速发展&#xff0c;AI去衣技术已经逐渐成为图像处理和计算机图形学领域的一个热门话题。这种技术旨在通过算法模型去除或替换图像中的衣物&#xff0c;以服务于娱乐、电子商务、虚拟试衣等多种应用场景。而在实现高质量、真实…

getters的使用

getters的使用 如果state中的数据需要经过处理再使用&#xff0c;就可以利用getters函数

django在线考试系统-计算机毕业设计源码78268

摘 要 本论文主要论述了如何使用python语言、Django框架开发一个在线考试系统&#xff0c;本系统将严格按照软件开发流程&#xff0c;进行各个阶段的工作&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述该系统的当前背景以及系统开发的目的&#xf…

VMware虚拟机上安装麒麟V10操作系统

一、安装VMware 在前面的文章中我有具体介绍过如何安装VMware软件&#xff0c;这里就不具体介绍了&#xff0c;需要的同学可以点下面的连接进行下载安装。 玩转Linux—如何在Linux环境中部署MySQL、Redis和nginx_linux系统mysql、redis 主备怎么做-CSDN博客文章浏览阅读1k次&a…

每日百万交易的支付系统,如何设置JVM堆内存大小?

每日百万交易的支付系统,如何设置JVM堆内存大小? 1、支付背景的引入2、支付的核心业务流程3、每日百万交易支付系统的压力在哪里?4、支付系统每秒钟需要处理多少笔支付单5、每个支付订单处理需要耗时多久6、每个支付订单大概需要多大的内存空间7、每秒发起的支付请求对内存的…

c#核心学习1

一、面向对象的概念 1.面向过程编程 2.面向对象编程 3.为什么要学习面向对象编程 提高代码复用率、提高开发效率、提高程序可拓展性、清晰的逻辑关系 4.如何学习 二、面向对象--封装 1&#xff09;类和对象 1.什么是类 2.类申明在哪里 类一般声明在namespace语句块中 3.…

电商API接口(api商品数据)【电商商品实时数据采集API接口】

众多品牌选择电商API实时数据采集接口进行采购&#xff0c;主要是出于以下几个重要原因&#xff1a; 第一&#xff0c;高效便捷。比价工具通过自动化的方式获取价格信息&#xff0c;避免了繁琐的人工操作&#xff0c;大大节省了时间和精力。 第二&#xff0c;精准比较。API比价…

AIGC 003-Controlnet升级你的SD让图像生成更加可控!

AIGC 003-Controlnet升级你的SD让图像生成更加可控&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 ControlNet 论文 (Adding Conditional Control to Text-to-Image Diffusion Models) 提出了一种名为 ControlNet 的神经网络结构&#xff0c;旨在为大型文本到图…