C语言学习记录(十二)——指针与数组及字符串

文章目录

  • 前言
  • 一、指针和数组
  • 二、指针和二维数组
    • **行指针(数组指针)**
  • 三、 字符指针和字符串
  • 四、指针数组


前言

一个学习嵌入式的小白~ 有问题评论区或私信指出~


提示:以下是本篇文章正文内容,下面案例可供参考

一、指针和数组

  • 在C语言中 ,数组的指针是指数组在内存中的起始地址,数组元素的地址是指数组元
    素在内存中的起始地址。
  • 一维数组的数组名为一维数组的指针(起始地址)

例如:

		double x[8]; //x为数组的起始地址double *p;p = x;

设指针变量px的地址值等于数组指针x(即指针变量px指向数组的首元素),则:
x[i] 、 (px+i)、(x+i) 和px[i]具有完全相同的功能:访问数组的第i+1个数组元素

int a[10], *p ; p=a;

在这里插入图片描述

p[i] <==> *(p+i)

  • 注意:
    • 指针变量和数组在访问数组中元素时,一定条件下其使用方法具有相同的形式,因为
      指针变量和数组名都是地址量
    • 但指针变量和数组的指针(或叫数组名)在本质上不同,指针变量是地址变量,而数
      组的指针是地址常量

数组名是地址常量
p++ ,p-- (对)
a++, a-- (错)
a+1 ,*(a+2) (对)

题目:数组反序存放

#include <stdio.h>void swap(int *p1,int *p2);//交换函数
void swaparr(int arr[],int lenth);//数组为形参
void swapprr(int *arr,int lenth);//指针为形参int main()
{int arr[10];for(int i = 0;i<10;i++)//循环输入数组中的元素{scanf("%d",&arr[i]);}swapprr(arr,10);//进行数组反序for(int i = 0;i<10;i++)//遍历反序之后的数组{printf("%d ",arr[i]);}return 0;}
void swap(int *p1,int *p2)//交换函数
{int temp;temp = *p1;*p1 = *p2;*p2 = temp;
}
void swaparr(int arr[],int lenth)反序函数
{for(int i=0;i<=((lenth-1)/2);i++){swap(&arr[i],&arr[lenth-1-i]);}
}	 void swapprr(int *arr,int lenth)
{for(int i=0;i<=((lenth-1)/2);i++){swap((arr+i),(arr+lenth-1-i));}
}

二、指针和二维数组

多维数组就是具有两个或两个以上下标的数组
在C语言中 ,二维数组的元素连续存储,按行优先存
在这里插入图片描述

题目:一级指针遍历二维数组

#include <stdio.h>
#include <stdlib.h>int main()
{int arr[][3] = {{1,2,3},{4,5,6},{7,8,9}};int *p,i;p = arr;for(i = 0;i < 9;i++){printf("%d ",*(p+i));}return 0;}

可以把二维数组看作由多个一维数组组成。
比如ina a[3][3] ,含有三个元素,a[0],a[1],a[2]
元素a[0],a[1],a[2]都是一维数组名
二维数组名代表数组的起始地址,数组名加1,是移动一行元素。因此,二维数组名常被
称为行地址。
在这里插入图片描述

行指针(数组指针)

存储行地址的指针变量,叫做行指针变量,形式如下:

  • <存储类型> <数据类型> (*<指针变量名>){ 表达式n };
  • 例如:
		int  a[2][3] ;   int (*p)[3];

方括号中的常量表达式表示指针加1,移动几个数据。
当用行指针操作二维数组时,表达式一般写成1行的元素个数,即列数。

题目:使用行指针表示二维数组的某个元素

#include <stdio.h>
#include <stdlib.h>int main()
{int arr[][3] = {{1,2,3},{4,5,6},{7,8,9}};int (*p)[3],i,j;p = arr;for(i = 0;i < 3;i++)for(j = 0;j < 3;j++)printf("%d ",*(*(p+i)+j));return 0;}

三、 字符指针和字符串

  • C语言通过使用字符数组来处理字符串
  • 通常,我们把char数据类型的指针变量称为字符指针变量。字符指针变量与字符有着
    密切关系,他也被用来处理字符串。
  • 初始化字符指针是把内存中字符串的首地址赋予指针,并不是把该字符串复制到指针
    中。
	char  str[] = "Hello World";char *p  = str;
  • 在C语言编程中,当一个字符指针指向一个字符串常量时,不能修改指针指向的对象
    的值
	char *p = "Hello World"*p  = 'h';

题目:不使用任何字符串函数,实现字符串函数连接功能

#include <stdio.h>
#include <stdlib.h>int Mystrlen(char *p);
int main()
{char a[100],b[100],c[100];char *p;p = c;int l1,l2;printf("please input first string:");gets(a);printf("please input conented string:");gets(b);l1 = Mystrlen(a);l2 = Mystrlen(b);for(int i = 0 ; i<(l1+l2) ; i++){if(i < l1){p[i] = a[i];}else{p[i] = b[i-l1];}if( i == (l1+l2-1)){p[i+1] = '\0';}}printf("%s\n",c);return 0;
}
int Mystrlen(char *p)
{int n = 0;for(int i = 0 ; i < 100 ; i++){if(p[i] != '\0'){n++;}else{return n;}}return n;
}

四、指针数组

所谓指针数组是指由若干个具有相同存储类型和数据类型的指针变量构成的集合
指针数组的一般说明形式:

  • <存储类型 > <数据类型> *<指针数组名> [<大小>]
  • 指针数组名表示该指针数组的起始地址
    声明一个指针数组
double *pa2[2] , a[2][3];

把一维数组a[0] 和 a[1]的首地址分别赋予指针变量数组的数组元数pa[0] 和pa[1];

pa[0] = a[0]; //等价于pa[0] = &a[0][0]
pa[1] = a[1]; //等价于pa[1] = &a[1][0]

此时pa[0]指向了一维数组a[0]的第一个元素,而pa[1]指向了一维数组a[1]的第一个元素。

题目:使用指针数组处理二维数组,求出二维数组所有元素的和。

#include <stdio.h>
#include <stdlib.h>int main()
{int arr[][3] = {{1,2,3},{4,5,6},{7,8,9}};int *pa[3];int i,j,sum = 0;for(i = 0;i < 3;i++){pa[i] = arr[i];}for(i = 0;i < 3;i++)for(j = 0;j < 3;j++)sum += *(pa[i]+j);printf("%d",sum);return 0;
}

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

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

相关文章

【vscode插件】多行注释

最近在编写C程序的过程中&#xff0c;笔者发现&#xff0c;vscode默认的多行注释是使用单行注释拼起来的&#xff0c;对于笔者想要突出多行注释&#xff0c;同时便于后续修改的需求无法满足&#xff0c;随体验一下自己开发VSCODE插件。 可以说&#xff0c;整个插件的开发和上线…

软件开发生命周期(Software Development Life Cycle, SDLC)

目录 简介 简介 软件开发生命周期&#xff08;Software Development Life Cycle, SDLC&#xff09;是软件从概念到正式交付和维护的一系列阶段。每个阶段都有其特定的目标和活动&#xff0c;以下是软件开发生命周期中常见的几个阶段&#xff1a; 需求收集与分析&#xff08;R…

IndexError: image index out of range

IndexError: image index out of range 这个错误通常意味着你尝试访问的图像索引超出了图像的实际尺寸范围。在你给出的代码行&#xff1a; s_img_point_color_list.append(s_pixels[coordinate[0], coordinate[1]])你正在尝试从 s_pixels 这个变量&#xff08;很可能是一个图…

Android系统为什么lmkd杀到adj 100就代表有低内存?

在Android系统中&#xff0c;lmkd&#xff08;Low Memory Killer Daemon&#xff0c;低内存终止守护进程&#xff09;负责监控系统的内存状态&#xff0c;并在内存压力较高时通过终止不必要的进程来释放内存&#xff0c;以维持系统的稳定运行。关于lmkd为何在杀到adj&#xff0…

Nginx负载均衡及动静分离

目录 一、Nginx负载均衡【重点】 1.1 轮询 1.2 权重 1.3 ip_hash 二、Nginx动静分离【重点】 2.1 动态资源代理 2.2 静态资源代理 官方文档 nginx 一、Nginx负载均衡【重点】 Nginx为我们默认提供了三种负载均衡的策略&#xff1a; 轮询&#xff1a;将客户端发起的请求…

【chatgpt】pytorch中requires_grad=True

在 PyTorch 中&#xff0c;requires_gradTrue 是一个非常重要的标志&#xff0c;它指示 PyTorch 是否需要为某个张量计算梯度。这在训练神经网络时尤为关键&#xff0c;因为我们通常需要通过反向传播来更新模型参数&#xff0c;以最小化损失函数。 requires_gradTrue 的作用 …

Perl变量作用域全解析:掌握变量的可见之旅

Perl变量作用域全解析&#xff1a;掌握变量的可见之旅 Perl是一种灵活的脚本语言&#xff0c;以其对文本处理的强大能力而闻名。在Perl编程中&#xff0c;变量作用域的概念至关重要&#xff0c;它决定了变量在代码中的可见性和生命周期。本文将深入探讨Perl中变量作用域的定义…

AI降重,不再难:降AI率的实用技巧大揭秘

如何有效降低AIGC论文的重复率&#xff0c;也就是我们说的aigc如何降重&#xff1f;AIGC疑似度过高确实是个比较愁人的问题。如果你用AI帮忙写了论文&#xff0c;就一定要在交稿之前做一下AIGC降重的检查。一般来说&#xff0c;如果论文的AIGC超过30%&#xff0c;很可能会被判定…

CAS操作

CAS 全称:Compare and swap,能够比较和交换某个寄存器中的值和内存中的值,看是否相等,如果相等,则把另外一个寄存器中的值和内存进行交换. (这是一个伪代码,所以这里的&address实际上是想要表示取出address中的值) 那么我们可以看到,CAS就是这样一个简单的交换操作,那么…

基于SpringBoot房屋租赁管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; Java精品实战案例《1000套》 2025-2026年最值得选择的Java毕业设计选题大全&#xff…

TVBox自定义配置+软件密码版本

apk地址 : https://gitee.com/wheat-wheat/kekeda-duck-apk 1、安装安卓SDK Android SDK Windows 安装及环境配置教程_sdk manager windows-CSDN博客 修改点: 基础配置: java版本:

在系统已经存在postgres时,安装gitlab

以下作废&#xff0c;感觉直接装gitlab太不稳定了&#xff0c;现在转而使用dockers安装gitlab https://cloud.tencent.com/developer/article/2309562 https://www.cnblogs.com/lvzhenjiang/p/14949722.html https://cloud.tencent.com/developer/article/2256871 https://blo…

新火种AI|国产大模型展开决战,是资本游戏还是技术革命?

作者&#xff1a;一号 编辑&#xff1a;美美 资本角逐与技术革新&#xff0c;国产大模型的双线战场已然开启。 随着人工智能技术的不断进步&#xff0c;国产大模型正迅速成为行业关注的焦点。在这个由数据驱动的时代&#xff0c;资本的注入和技术创新的加速&#xff0c;让国…

Spring Cloud中的服务路由与过滤技术实现

Spring Cloud中的服务路由与过滤技术实现 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在微服务架构中&#xff0c;服务路由与过滤是确保服务之间通信有效性和安全性的重要技术。Spring Cloud作为…

Python28-6 随机森林

随机森林算法详细介绍 1. 理论背景 随机森林&#xff08;Random Forest&#xff09;是一种由Leo Breiman和Adele Cutler在2001年提出的集成学习方法。它结合了多个决策树的预测结果&#xff0c;以提高模型的准确性和鲁棒性。 2. 算法细节 随机森林的构建过程可以分为以下几…

Qt——升级系列(Level Eight):界面优化

目录 QSS 背景介绍 基本语法 QSS设置方式 指定控件样式设置 全局样式设置 从文件加载样式表 使用Qt Designer 编辑样式 选择器 选择器概况 子控件选择器 伪类选择器 样式属性 盒模型 控件样式示例 按钮 复选框、单选框 输入框 列表 菜单栏 登录界面 绘图 基本概念 绘制各种形…

[Go 微服务] Kratos 使用的简单总结

文章目录 1.Kratos 简介2.传输协议3.日志4.错误处理5.配置管理6.wire 1.Kratos 简介 Kratos并不绑定于特定的基础设施&#xff0c;不限定于某种注册中心&#xff0c;或数据库ORM等&#xff0c;所以您可以十分轻松地将任意库集成进项目里&#xff0c;与Kratos共同运作。 API -&…

Linux内网端口转公网端口映射

由于服务商做安全演练&#xff0c;把原先服务器内网的端口映射到外网端口全都关闭了&#xff0c;每次维护服务器特别麻烦&#xff0c;像数据库查询如果用原生的mysql 去连接&#xff0c;查询返回的结果乱了&#xff0c;非常不方便。 查了服务还是可以正常访问部分外网的&#x…

知识图谱查询语言的表示

文章目录 SPARQL知识图谱查询基本构成常见的SPARQL查询算子语义Markup表示语言SPARQL知识图谱查询基本构成 RDF 支持类似数据库的查询语言,叫作SPARQL,它提供了查询RDF 数据的标准语法、处理SPARQL查询的规则以及结果返回形式。 变量,RDF中的资源,以“?”或者“$”指示;…

【chatgpt】pytorch的全连接层FC

文章目录 创建全连接层全连接层&#xff08;线性层&#xff09;使用 PyTorch 定义全连接层1. 定义一个全连接层2. 查看层的参数3. 使用全连接层 示例&#xff1a;构建一个简单的神经网络总结 打印FC参数输出解释完整代码示例示例输出总结 线性层的参数和属性线性层的参数和属性…