【C语言】指针进阶第二站:指针数组!

点击蓝字

9cb022749b53d00170e785a4abfc0a64.png

关注我们

指针数组

数组是一种类型的数的集合

整型数组的元素都是int类型

指针数组的元素都是指针变量

int* arr1[10];//整型指针的数组char*arr2[10];//一级字符指针的数组char** arr3[5];//二级字符指针的数组

参考这一份示意图

484532a84b435124636de956f7550469.png

示例1:定义多个字符指针

在上一站的字符指针里面,提到了可以直接用指针来创建一个常量字符串

同理,我们可以将多个指针放在一块,凑成指针数组,一次性创建多个指向常量字符串的指针

5f94151ce40c2696e7d115e512e110a8.png

int main()
{
char* arr[] = { "abcdef", "qwer", "zhangsan" };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){
printf("%s\n", arr[i]);}
return 0;
}

示例2:存放数组名的数组

在之前的学习中,我们知道:数组名代表数组首元素的地址

可以说,数组名本质上也是一个指针

既然是指针,就能放进指针数组里面

int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };int* arr[] = {arr1, arr2, arr3};
//arr是指针数组
int i = 0;
for (i = 0; i < 3; i++){
int j = 0;
for (j = 0; j < 5; j++){
printf("%d ", arr[i][j]);//*(*(arr+i)+j)}
printf("\n");}return 0;
}

这串代码中,我们需要了解的是arr[i][j]和*(*(arr+i)+j)之间的关系

以下内容若有错误,还请大家在评论区指正!

arr[i][j]和*(*(arr+i)+j)

它们都是访问数组的形式,用到了不同的操作符
但表达的含义相同:下标为i、j的元素

在内存中,数据的存储是连续的

创建一个二维数组,可以看到两行的数据是连续存放在数组里面的

int arr4[2][2]={{1,2},{3,4}};

既然是连续的,我们就可以用指针++的形式来访问二维数组里面的所有元素

*(arr+i)指向第i行元素
*(arr+i)+j指向第i行下标为j的元素的地址
*(*(arr+i)+j)再次解引用,得到j元素

数组名的本质是地址,是该数组首元素的地址

二维数组的首元素是第一行,数组名arr就是第一行的地址

我们可以把二维数组的每一行理解为独立的一个一维数组

这时候,二维数组的形式和上述代码中int* arr[]数组的形式就相同了

int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
//arr1 arr2 arr3是二维数组里面的每一行
int* arr[] = {arr1, arr2, arr3};
//arr等价于一个二维数组,但有不同


int* arr[]和二维数组的不同

int*arr数组里的元素arr1,arr2,arr3的地址是连续存放的

这里设计到一个新概念:数组指针

将在下一节讲解!

5263240da15b713f5ab57038f8dcaac7.png

但是它们对应的各自的数组内数据并不连续

如:arr1和arr2这两个数组各自元素的地址并不连续

46af592df9ee9e787c377f4eb4d4e953.png

示例3:存放二级指针的数组

既然一级指针可以放进数组里,二级指针也是指针,同样也能塞进数组里

下面这串代码里面的arr2就是一个存放二级指针的数组

#include <stdio.h>
int main()
{
int a = 10;
int* p = &a;
int** pp = &p;
int** arr2[4] = {pp};return 0;
}

你学会了吗?下次给大家分享数组指针哦!

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

8883446aa962a685a2cdcbfbdcef99cb.png

dfc7c5d55180a18a8eafc2da9dadb0b6.gif

戳“阅读原文”我们一起进步

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

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

相关文章

Python3不用str自带lower转换位小写字母

Python3不用str自带lower转换位小写字母原题 https://leetcode-cn.com/problems/to-lower-case/ 题目&#xff1a; 不准用字符串自带的lower() API&#xff01; 实现函数 ToLowerCase()&#xff0c;该函数接收一个字符串参数 str&#xff0c;并将该字符串中的大写字母转换成小…

php 命令执行crud_使用活动记录执行CRUD

php 命令执行crud本文是我们学院课程“ jOOQ –类型安全数据库查询”的一部分 。 在SQL和特定关系数据库很重要的Java应用程序中&#xff0c;jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多而JDBC过于抽象时&#xff0c;这是一种替代方法。 它显示了一种现代的领域特定语言…

python所有的父类_object代表所有类的父类吗??

作者&#xff1a;邹冲 链接&#xff1a;https://www.zhihu.com/question/19754936/answer/202650790 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 写东西的时候刚好遇到这个问题&#xff0c;回答一波…… 继承 obje…

C语言初学者常见错误 | 总结22点

点击蓝字关注我们正文一.语言使用错误在打代码的过程中&#xff0c;经常需要在中文与英文中进行转换&#xff0c;因此常出现一些符号一不小心就用错&#xff0c;用成中文。例如&#xff1a;“&#xff1b;”中文中的分号占用了两个字节&#xff0c;而英文中“;”分号只占用一个…

Python3实现队列

Python3实现队列class MyQueue:def __init__(self):self.__arr []def push(self, x: int) -> None:self.__arr.append(x)def pop(self) -> int:return self.__arr.pop(0)def peek(self) -> int:return self.__arr[0]def empty(self) -> bool:return len(self.__ar…

nginx配置vue项目500_一个Nginx部署多个vue前端项目总结

摘要&#xff1a;近来接手了一个二次开发的前后端分离模式的项目&#xff0c;其中在前端项目的部署上需要让2个前端项目都部署到一个IP地址和端口下&#xff0c;那么我们这里就要用到Nginx了&#xff0c;接下来我们看看如何在一个Nginx下部署2个前端项目的编译打包2个前端项目执…

vaadin_Vaadin和DukeScript中的Hello World

vaadin从表面上看 &#xff0c; Vaadin和GWT通常与DukeScript有很多共同点。 两者都致力于为Java开发人员提供面向浏览器的解决方案&#xff0c;并且由于其对Maven的原生支持&#xff0c;因此与IDE集成良好。 但是&#xff0c;这些方面实际上是它们共有的全部。 从编程模型到框…

【C语言】指针进阶第三站,数组指针!

点击蓝字关注我们数组指针整型指针&#xff1a;指向整型的指针字符指针&#xff1a;指向字符的指针数组指针&#xff1a;指向数组的指针基本概念下面哪个是数组指针呢&#xff1f;指针数组和数组指针的概念很容易混淆&#xff0c;一定要分清楚哦&#xff01;int *p1[10]; int (…

Python3判断是否为回文数

Python3判断是否为回文数原题 https://leetcode-cn.com/problems/palindrome-number/ 题目&#xff1a; 不允许用str的方法&#xff01; 判断一个整数是否是回文数。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。…

lambda 序列化_如何以及为什么要序列化Lambda

lambda 序列化总览 lambda序列化在许多用例中很有用&#xff0c;例如持久配置或作为远程资源的访客模式 。 远程访客 例如&#xff0c;因此我想访问远程Map上的资源&#xff0c;可以使用get / put&#xff0c;但是说我只想从Map的值中返回一个字段&#xff0c;我可以将lambda作…

python进行数据查询_如何进行python数据库查询?(实例解析)

在这篇文章之中我们来了解一下关于python数据库的相关知识&#xff0c;有些朋友可能是刚刚接触到python这一编程语言&#xff0c;对这一方面不是特别的了解&#xff0c;在接下来这篇文章将会来带大家来了解关于python查询数据库中数据的相关知识。 数据库的查询操作 Python查询…

【C语言】指针进阶第四站:数组/指针的传参问题!

点击蓝字关注我们朋友们&#xff0c;到站啦&#xff01;指针进阶第四站&#xff1a;传参问题0.引例自定义函数里形参的类型&#xff0c;要和函数调用中传过去的实参类型相对应test函数里的是int类型&#xff0c;我们传过去的参数a也是int类型void test(int n) {} int main() {i…

python做自动化控制postman_python自动化测试入门篇-postman

接口测试基础-postman 常用的接口有两种&#xff1a;webservice接口和http api接口。 Webservice接口是走soap协议通过http传输&#xff0c;请求报文和返回报文都是xml格式。 http api接口是走http协议&#xff0c;通过路径来区分调用的方法&#xff0c;请求报文都是key-value形…

Python3实现红黑树[上篇]

Python3实现红黑树[上篇]由于时间有限&#xff0c;这次只写了红黑树添加节点&#xff0c;关于节点的删除放在下一讲 https://blog.csdn.net/qq_18138105/article/details/105324025。 关于红黑树的介绍&#xff0c;来由&#xff0c;性质和定义&#xff0c;可以看这篇文章&…

web应用程序并发测试_测试并发应用

web应用程序并发测试本文是我们名为Java Concurrency Essentials的学院课程的一部分。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全性的概念。 在这里查看 &#xff01; 目录…

深入理解存储器层次结构

点击蓝字关注我们1概述对于一个简单的计算机系统模型&#xff0c;我们可以将存储器系统看做是一个线性的字节数组&#xff0c;而 CPU 能够在一个常数时间内访问每个存储器的位置。实际上&#xff0c;存储器系统&#xff08;memory system&#xff09;是一个具有不同容量、成本和…

python中可选参数是什么意思_Python如何定义有可选参数的元类

问题 你想定义一个元类&#xff0c;允许类定义时提供可选参数&#xff0c;这样可以控制或配置类型的创建过程。 解决方案 在定义类的时候&#xff0c;Python允许我们使用 metaclass关键字参数来指定特定的元类。 例如使用抽象基类&#xff1a; from abc import ABCMeta, abstra…

C++的一个指针占内存几个字节?

C的一个指针占内存几个字节&#xff1f;结论&#xff1a; 取决于是64位编译模式还是32位编译模式&#xff08;注意&#xff0c;和机器位数没有直接关系&#xff09; 在64位编译模式下&#xff0c;指针的占用内存大小是8字节在32位编译模式下&#xff0c;指针占用内存大小是4字…

jmc线程转储_使线程转储智能化

jmc线程转储很久以前&#xff0c;我了解了一个称为Log MDC的东西&#xff0c;我对此非常感兴趣。 我突然意识到日志文件中发生的一切&#xff0c;并指出了特定的日志条目&#xff0c;并找到了对错&#xff0c;特别是在调试生产中的错误时。 2013年&#xff0c;我受委托从事一个…

【C语言】指针进阶第五站:函数指针!

点击蓝字关注我们函数指针函数也有自己的地址&#xff0c;函数名/&函数名 就是函数的地址1.1基本形式在 数组指针的学习中我们了解到int arr[5]; int (*pa)[5] &arr;//pa是数组指针指针变量pa的类型是int(*)[5]那么函数指针的形式是怎样的呢&#xff1f;void test(cha…