指针进阶(三)再谈数组与串函数

news2025/1/13 15:35:53

🌞欢迎来到C语言的世界 
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

🌟本文由卿云阁原创!

🌠本阶段属于练气阶段,希望各位仙友顺利完成突破

📆首发时间:🌹2023年1月4日🌹

✉️希望可以和大家一起完成进阶之路!

🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!


🍈 数组的实质

      表达式a[b]等价于表达式*((a)+(b)),并且由于加法交换律,所以它也等价于b[a]。在表达式a和b中,表达式结果必须一个是指针,另一个是整型数据。指针可以是数组名的值、指针变量、用&获取的地址或者是由它们构成的表达式,通过指针指向的数据类型和整数就可以确定表达式a[b]的值所在的地址,因而就可以确定a[b]的值。

例:有一维数组int a[10]={1,2,3,4,5,},x=2 ,p=a;,指出下列表达式的值:(x*x)[a]、(a+2)[2]、(p+4)[0]、p[4]、4[p]的值。

(x*x)[a]: 2*2的值是4,所以下标是4,a是地址,表达式的值是5。

(a+2)[2]:a+2代表地址,下标是2,表达式的值是5。

(p+4)[0]:p+4代表地址,下标是0,表达式的值是5。

p[4]:p代表地址,下标是4,表达式的值是5。

4[p]:p代表地址,下标是4,表达式的值是5。

 对于二维数组a,表达式a[b]同样有效(b为整数),即它的值也为*((a)+(b))。此时,因为a指向的数据类型是一维数组,则a[b]就是从地址a开始向后的第b行那个一维数组,所以此时a[b]的值是一个指针值,它指向这个一维数组的第0个元素。所以在a[b][c]这种形式中(c为整数),a[b]是一个指针,它指向的类型是一维数组元素的类型,因此a[b][c]也是一个“指针[整数]”的形式,根据加法交换律,它也可以写成“c[a[b]]”的形式。

例如,有int a[2][3]={1,2,3,4,5,6}; 则a[0][2]、2[a[0]]、(*a)[2]、2[*a]、*(*a+2)、*(2+*a)、2[a[0]]都是同一个变量,其值都为3。

因此,在如形a[b]这样的形式中,地址不一定只能用数组名,可以直接是一个指针值,如"abc"[1]也是符合语法的,其值为'b'。如果有一个指向一维数组的指针变量arr,也可以写成arr[b][c]的形式,其结果与*(*(arr+b)+c)是一样的。因此,在一个定义的函数中,如果一个指向一维数组的指针变量形参arr接收到一个二维数组名a的值时,只要它们指向的一维数组类型一致,则arr[i][j]就是a[i][j]。 

例.把一个二维数组中第0行和第1行看成两个向量,写一个函数,计算这两个向量的点积并返回它们的值。两个向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的点积定义为:a·b=a1b1+a2b2+……+anbn。

#include <stdio.h>
float dot_product(int col,float (*x)[col])//col为列数。
{
    float sum=0;
    int i; 
    for(i=0;i<col;i++)
        sum+=x[0][i]*x[1][i];  //注意这里的写法。 
    return sum;
}
int main(void)
{
	float a[2][3]={1,2,3,4,5,6};
	printf("%f\n",dot_product(3,a));
	return 0;
}

 🍉串函数

输出字符串的函数:int puts(const char *string)

接收字符串的函数:char* gets(char*buffer);

字符串复制函数:char *strncpy(char *dest, char *src,size_t  n);

这些函数中的指针类型形参,实质上需要接收的只是指针值,操作时,都是以地址为标准的,例如调用puts输出一个字符串str,写成puts(str),它执行的过程实质上是根据str里的地址值进行的,即从这个地址值开始输出字符,直到遇到'\0'为止。掌握了这个实质,就可以进一步去灵活运用它。

例如,有char str[]="A student";,要直接输出后一个单词,用puts函数只要写成:puts(str+2);,因为str+2作为一个指针,指向字符's'。

再例如,对于char str1[10]="A student",str2[]="teacher";,要把student换成teacher,只要写成:strcpy(str1+2,str2)。

在一个二维字符数组str[M][N]中,可以用printf("%s",str[i])输出第i行的串,也可以用printf("%s",str[i]+k);从第i行的k个字符开始输出字符串。

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

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

相关文章

【阶段二】Python数据分析数据可视化工具使用01篇:数据可视化工具介绍、数据可视化工具安装、折线图与柱形图

本篇的思维导图: 数据可视化工具介绍 Matplotlib是最著名的绘图库,主要用于二维绘图,当然也可以进行简单的三维绘图。它提供了一整套丰富的命令,让我们可以非常快捷地用Python可视化数据,而且允许输出达到出版质量的多种图像格式。 Seaborn是在matplo…

国内电容市场份额达七成,松下如何抢占高地?

01 电容市场发展 电容器是三大电子被动元器件之一&#xff0c;是电子线路中不可缺少的基础元件&#xff0c;约占全部电子元件用量的40%&#xff0c;产值的66%。中国电容器行业规模增速持续高于全球规模增速&#xff0c;中国市场的快速增长成为拉动全球电容器行业规模增长的主要…

【Python从入门到进阶】2、Python环境的安装

接上篇《1、初识Python》 上一篇我们对Python这门编程语言进行了一个基本的了解&#xff0c;本篇我们来学习如何下载安装Python编程环境&#xff0c;以及如何使用pip管理Python包。 本篇讲解的是Windows环境下安装Python编程环境的步骤。 一、Python安装包下载 想要使用Pyth…

vue框架、element-ui组件库、font awesome图表库

一、vue 创建一个新vue项目。 vue create ProjectName 然后cd到该目录下&#xff0c;npm run serve启动服务器&#xff0c;即可打开。 二、组件库 element-ui是饿了么的&#xff0c;ArcoDesign是字节的&#xff0c;有很多。 install见官方文档&#xff1a;组件 | Element 导入…

黑马学SpringAMQP

目录&#xff1a; &#xff08;1&#xff09;SpringAMQP的基本介绍 &#xff08;2&#xff09;SpringAMQP-入门案例的消息发送 &#xff08;3&#xff09; SpringAMQP-入门案例的消息接收 &#xff08;4&#xff09;SpringAMQP-WorkQueue模型 &#xff08;5&#xff09;Sp…

408数据结构考点总结

第一章 绪论 考点 1&#xff1a;时间复杂度与空间复杂度 时间复杂度 定义&#xff1a;将算法中基本运算的执行次数的数量级作为时间复杂度&#xff0c;记为O(n)O(n)O(n)。 计算原则 加法法则&#xff1a;T(n)T1(n)T2(n)O(f(n))O(g(n))O(max⁡(f(n),g(n)))T(n)T_{1}(n)T_{2…

安全—02day

XMLHttpRequest 对象 AJAX 通过原生的XMLHttpRequest对象发出 HTTP 请求&#xff0c;得到服务器返回的数据后&#xff0c;再进行处理。现在&#xff0c;服务器返回的都是 JSON 格式的数据&#xff0c; XMLHttpRequest本身是一个构造函数&#xff0c;可以使用new命令生成实例。…

T113_PRO-S3_GPS解析

今天主要是以市面上能买到的最新款的GPS作为解析的依据&#xff0c;市面上能买的GPS目前最新的串口打印的格式主要是如下&#xff1a; $GNGGA,085126.000,2311.77819,N,11323.44968,E,1,15,1.5,36.7,M,0.0,M,,*4C $GNGLL,2311.77819,N,11323.44968,E,085126.000,A,A*4B $GPGSA…

Java入门-0基础学Java-01Java环境变量配置

JDK的下载与安装jdk下载地址&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html选择与电脑系统匹配的版本进行下载&#xff08;Windows系统如果是32位下载Windows x86&#xff0c;64位下载Windows x64&#xff0c;苹果的下载M…

Go语言设计与实现 -- 调度器总体概述

Go语言调度器使用与CPU数量相等的线程来减少线程频繁切换带来的内存开销&#xff0c;同时在每一个线程上执行额外开销更低的Goroutine来降低操作系统和硬件的负载。 每一次线程上下文切换都需要消耗约1us的时间&#xff0c;而Go调度器对Goroutine的上下文的切换约为0.2us&#…

01_FreeRTOS基础知识

目录 裸机与RTOS介绍 裸机与RTOS特点 FreeRtos简介 任务调度简介 抢占式调度 时间片调度 协程式调度 任务状态 裸机与RTOS介绍 假设小明在打游戏,此时女盆友微信回复了信息。 裸机:在裸机上实现是等这游戏打完之后,在去回复女朋友的信息,假设游戏刚刚开始打完需要半小…

使用缓存保护MySQL

1 更新缓存最佳实践 Redis的执行器非常薄&#xff0c;所以Redis只支持有限API&#xff0c;几乎没聚合查询能力&#xff0c;也不支持SQL。存储引擎也简单&#xff0c;直接在内存中用最简单数据结构保存数据。 如Redis的LIST在存储引擎的内存中的数据结构就是双向链表。内存是易…

基于ONNX人脸识别实例(SCRFD/ArcFace)-C#版

一、引用 Microsoft.ML.OnnxRuntime OpenCvSharp OpenCvSharp.Extensions二、人脸检测(Face Detection) using System; using System.Collections.Generic; using System.Linq; using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp;…

c++11 标准模板(STL)(std::deque)(十)

定义于头文件 <deque> std::deque 修改器 移除首元素 std::deque<T,Allocator>::pop_front void pop_front(); 移除容器首元素。若容器中无元素&#xff0c;则行为未定义。 指向被擦除元素的迭代器和引用被非法化。若元素是容器中的最后元素&#xff0c;则尾后…

2022 数字IC设计秋招复盘——数十家公司笔试题、面试实录

0 引言 秋招结束了。 “今年是前五年最差的一年&#xff0c;也将是后五年最好的一年”&#xff0c;虽然无法预知后面的就业情况&#xff0c;但就我今年自己的亲身经历与去年师兄师姐找工作的情况对比&#xff0c;感觉难度确实是增大了很多。我总共投递了80家左右的公司&#…

德云社相声春晚未播先火,郭德纲独揽三个节目,四位老艺术家助阵

随着央视春晚的二次彩排&#xff0c;德云社相声春晚&#xff0c;也被安排到议事日程当中&#xff0c;听说今年的相声春晚还颇有看点。由于缺少了岳云鹏张云雷等得力干将&#xff0c;郭德纲老师决定亲自下场&#xff0c;一个人就独揽了三个节目。 按说德云社举办相声春晚&#x…

乒乓普及套及廉价底板评测

疫情的末端期间开始打乒乓球&#xff0c;最开始在单位打&#xff0c;后来去了花园和大爷们打。用了几个拍子和胶皮&#xff0c;都是网上最便宜的&#xff0c;现在在野球场能排到前十吧&#xff0c;我打球比较“正”&#xff08;他人评价&#xff09;&#xff0c;大家比较愿意和…

基于Java+SpringBoot+vue+element等动物救助平台设计和实现

基于JavaSpringBootvueelement等动物救助平台设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取…

数字人民币创新浪潮来袭,支付机构如何“乘风破浪”?

易观&#xff1a;近年来&#xff0c;数字经济浪潮迭起&#xff0c;数字科技方兴未艾。法定数字货币作为各国政府掌握货币发行控制权的重要载体&#xff0c;正在全球范围内全面铺开。法定数字货币的推出将大幅提升货币的流转效率&#xff0c;为央行管理职能赋予了数字化内涵。可…

Golang 常用字符串函数

统计字符串长度&#xff0c;按字节 len(str)str : "你好" fmt.Println("len", len(str))字符串遍历&#xff0c;同时处理有中文的问题 s : []rune(str)str : "你好" s : []rune(str) for i : 0; i < len(s); i {fmt.Printf("string%c\n&…