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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网盘挂载系统-知识资源系统-私域内容展示系统

系统介绍&#xff1a; 存储&#xff1a;一共支持约30款云盘存储&#xff0c;其中包括主流的&#xff08;百度网盘、阿里云盘、夸克云盘、迅雷云盘、蓝奏云、天翼云盘&#xff09;&#xff0c;部分展示 以及特别的&#xff08;一刻相册、对象存储、又拍云存储、SFTP、MEGA 网盘…

锁机制 -- 概述篇

锁机制 1、概述 ​  加锁是为了解决并发场景下&#xff0c;多个线程对同一资源同时进行操作&#xff0c;而导致同一线程多次操作出现结果不唯一的情况&#xff08;一次操作包含多条指令&#xff09;。结果不唯一发生的原因在于指令的错乱&#xff0c;前提条件是多线程环境及…

原子变量原理剖析

一、原子操作 原子操作保证指令以原子的方式执行&#xff0c;执行过程不被打断。先看一个实例&#xff0c;如下所示&#xff0c;如果thread_func_a和thread_func_b同时运行&#xff0c;执行完成后&#xff0c;i的值是多少&#xff1f; // test.c static int i 0;void thread…

013、MongoDB常用操作命令与高级特性深度解析

目录 MongoDB常用操作命令与高级特性深度解析 1. 数据库操作的深入探讨 1.1 数据库管理 1.1.1 数据库统计信息 1.1.2 数据库修复 1.1.3 数据库用户管理 1.2 数据库事务 2. 集合操作的高级特性 2.1 固定集合(Capped Collections) 2.2 集合验证(Schema Validation) 2.…

自组装mid360便捷化bag包采集设备

一、问题一&#xff1a;电脑太重&#xff0c;换nuc 采集mid360数据的过程中&#xff0c;发现了头疼的问题&#xff0c;得一手拿着电脑&#xff0c;一手拿着mid360来采集&#xff0c;实在是累胳膊。因此&#xff0c;网购了一个intel nuc, 具体型号是12wshi5000华尔街峡谷nuc12i…

Python私教张大鹏 PyWebIO通过事件回调实现表格的编辑和删除功能

从上面可以看出&#xff0c;PyWebIO把交互分成了输入和输出两部分&#xff1a;输入函数为阻塞式调用&#xff0c;会在用户浏览器上显示一个表单&#xff0c;在用户提交表单之前输入函数将不会返回&#xff1b;输出函数将内容实时输出至浏览器。这种交互方式和控制台程序是一致的…

在Ubuntu 18.04.6 LTS 交叉编译生成Windows 11下的gdb 8.1.1

1. 安装mingw sudo apt-get install mingw-w64 2. 下载 gdb 8.1.1源码 https://ftp.gnu.org/gnu/gdb/gdb-8.1.1.tar.gz 解压命令 tar -xf gdb-8.1.1.tar.gz 进入目录,创建build目录: hq@hq:~/gdb-8.1.1/build$ 执行配置 ../confi

视频云计算的未来发展趋势:智能化、个性化与云端协同助力智慧城市安防监控

随着信息技术的飞速发展&#xff0c;云计算作为一种全新的服务模式&#xff0c;正在改变我们处理数据和信息的方式。而视频云计算技术&#xff0c;作为云计算领域的一个重要分支&#xff0c;以其独特的优势&#xff0c;正在逐步渗透到我们生活的各个领域。 一、视频云计算技术…

[leetcode hot 150]第一百二十二题,买卖股票的最佳时机Ⅱ

题目&#xff1a; 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得的 最大…

javaScript利用indexOf()查找字符串的某个字符出现的位置

1 创建字符串 2 利用indexof()查询字符串的字符 3 利用while循环判断indexOf是否等于-1&#xff0c;不等于-1就打印一次并且索引号1去查下一个字符 //创建字符串var str1234567812311231;var indexstr.indexOf(1);//查询该字符while(index !-1)//indexOf()没有查到会返回-1{…

企业本地大模型用Ollama+Open WebUI+Stable Diffusion可视化问答及画图

最近在尝试搭建公司内部用户的大模型,可视化回答,并让它能画图出来, 主要包括四块: Ollama 管理和下载各个模型的工具Open WebUI 友好的对话界面Stable Diffusion 绘图工具Docker 部署在容器里,提高效率以上运行环境Win10, Ollama,SD直接装在windows10下, 然后安装Docker…

Linux中彩色打印

看之前关注下公众号呗 第1部分&#xff1a;引言 1.1 Python在文本处理中的重要性 Python作为一种广泛使用的高级编程语言&#xff0c;以其简洁的语法和强大的功能在文本处理领域占有一席之地。无论是数据清洗、自动化脚本编写&#xff0c;还是复杂的文本分析&#xff0c;Py…

甄选范文“论云上自动化运维及其应用”,软考高级论文,系统架构设计师论文

论文真题 云上自动化运维是传统IT运维和DevOps的延伸,通过云原生架构实现运维的再进化。云上自动化运维可以有效帮助企业降低IT运维成本,提升系统的灵活度,以及系统的交付速度,增强系统的可靠性,构建更加安全、可信、开放的业务平台。 请围绕“云上自动化运维及其应用”…

Typora failed to export as pdf. undefined

变换版本并没有用&#xff0c;调整图片大小没有用 我看到一个博客后尝试出方案 我的方法 解决&#xff1a;从上图中的A4&#xff0c;变为其他&#xff0c;然后变回A4 然后到处成功&#xff0c;Amazing&#xff01; 参考&#xff1a; Typora 导出PDF 报错 failed to export…

识图生成代码:通义千问vsGPt4o,有点小崩

今日对比一下通义千问和GPt4o&#xff0c;在通过识别图片然后去生成前端代码 在当今ai的时代&#xff0c;通过ai去生成页面的代码可以很大的提高我们的开发效率下面是我们要求的生成的图片截图&#xff0c;这是掘金的榜单 效果对比 首先我们使用通义千问&#xff0c;让他去帮我…

Tesseract Python 图片文字识别入门

1、安装tesseract Index of /tesseract https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-v5.3.0.20221214.exe 2、安装中文语言包 https://digi.bib.uni-mannheim.de/tesseract/tessdata_fast/ 拷贝到C:\Program Files\Tesseract-OCR\tessdata 3、注…

Linux基础 - BIND加密传输缓存服务器

目录 零. 简介 一. 安装 二. 安全的加密传输 三. 部署缓存服务器 四. 总结 零. 简介 BIND&#xff08;Berkeley Internet Name Domain&#xff09;是一款广泛使用的开源 DNS&#xff08;域名系统&#xff09;服务器软件。 域名系统的主要作用是将易于人类理解的域名&…

《昇思25天学习打卡营第12天 | 昇思MindSpore基于MindSpore的GPT2文本摘要》

12天 本节学习了基于MindSpore的GPT2文本摘要。 1.数据集加载与处理 1.1.数据集加载 1.2.数据预处理 2.模型构建 2.1构建GPT2ForSummarization模型 2.2动态学习率 3.模型训练 4.模型推理

Windows怎么实现虚拟IP

在做高可用架构时&#xff0c;往往需要用到虚拟IP&#xff0c;在linux上面有keepalived来实现虚拟ip的设置。在windows上面该怎么弄&#xff0c;keepalived好像也没有windows版本&#xff0c;我推荐一款浮动IP软件PanguVip&#xff0c;它可以实现windows上面虚拟ip的漂移。设置…

MySQL学习(3):SQL语句之数据定义语言:DDL

1.SQL通用语法与分类 &#xff08;1&#xff09;通用语法 &#xff08;2&#xff09;分类 2.DDL 2.1数据库操作 show DATABASES; #查询所有数据库select DATABASE(); #查询当前数据库create DATABASE 数据库名称 [default charest 字符集] [collate 排列规则]; #default cha…