C语言中的数组指针和指针数组的概念和应用

大家好,我是三玹。

俗话说得好,C语言的指针是初学者的终点,也是高级Cer的起点。

在步入指针广袤的海洋中,会碰到各类形形的指针。其中,数组指针和指针数组是是一开始容易混淆的两个概念。

虽然这两个东西看着像是孪生兄弟一样,但它们的概念和工作方式是截然不同的。尤其放在代码中,有时候也分不清谁是谁。

想要区分哪个是数组指针,哪个是指针数组,最主要的就是看它声明时的符号。

在编程语言中,每个符号都具备相应的优先级。就跟我们学数学,先乘除后加减一个道理。

而在上面这两个声明中,()[] 的优先级算是最高的,解引用运算符 * 的优先级就要次于二者。

由此代入到声明,第一个式子中先是定义了一个指针 *arr,指针变量 arr 指向一个长度为 5 的匿名数组,数组中存储的是 5 个 int 类型的数据。所以第一个声明的是一个数组指针

第二个声明中,[] 的优先级最高,因此变量名先和 [5] 进行组成,构成了一个长度为 5 arr 数组。

每个数组中的所有元素都必须要有统一的类型,而此时的类型就是 int* 整型指针类型。即说明当前的 arr 数组中可以存储 5 个整数指针类型的值,所以第二个声明的是一个指针数组

这么说或许有点干,也有点绕,下面就将这两个拆开看一看。

数组指针,它首先是一个指针,是指向数组的指针类型。允许用指针的方式,来访问数组中的元素。

来看个例子,现在我们初始化了一个整形数组arr,里面包含了 5 个元素:

而后,我们再声明一个ptr的指针,用来指向这个数组。

当我们将数组变量赋值给指针变量,就是将数组的第一个元素 arr[0] 所在的内存地址赋值给了指针 ptr

因此,我们就可以直接使用这个指针来访问数组中的元素。

指针数组则是不同于数组指针的另一个概念,它首先是一个数组,然后数组中的每个元素都是一个指针

来看一个例子,假设我们有两个字符串:

此时,我们可以使用指针数组来存储这两个字符串:

这样一来,我们就可以使用下标来访问这个数组中的每个元素,例如:

需要注意的是,这里使用的是下标来访问数组中的元素,而不是用解引用运算符。

在C语言当中,数组变量名本身就是一个指向数组第一个元素的指针。因此,我们就可以直接将数组传递给函数来访问数组中的元素,例如:

在这个函数中,我们使用了数组指针来访问数组中的元素。

指针数组,我们可以用来存储动态分配的内存,例如:

在上面的代码中,我们使用了指针数组来存储动态分配的内存块。我们在用完这些内存后,需要使用 free 函数及时释放。

在C语言中,数组指针和指针数组是两种很常见的概念。它们都是用来存储和访问数据,但两者的工作方式是不同的。

  • 数组指针是指向数组的指针类型,可以用解引用运算符来访问数组中的元素;
  • 指针数组是存储指针的数组,可以通过下标来访问指针数组中的元素。

它们分别都有自己相应的应用场景:

  • 数组指针,常用于函数参数中,方便在函数中访问数组中的元素;
  • 指针数组,常用于动态分配内存,在使用完之后要及时释放内存。

学习数组指针和指针数组的时候,最重要的是要熟悉它们的工作方式,以及明白它们在 C 语言当中的应用场景。

刘心向学(8)指针数组的应用

分享兴趣,传播快乐,

增长见闻,留下美好!

亲爱的您,这里是LearningYard新学苑。

今天小编为大家带来文章 “刘心向学(8)指针数组的应用”

欢迎您的访问。

Share interest, spread happiness,

increase knowledge, leave a beautiful!

Dear, this is LearningYard Academy.

Today, the editor brings you an article \”Liu\’s Dedication to Learning (8) Applications of Pointer Arrays\”

Welcome your visit.

一、思维导图(Mind map)

二、引言(Introduction)

在C/C++编程语言中,指针数组是一个非常强大且灵活的工具,它允许程序员创建动态的数据结构、实现高效的字符串处理、构建函数指针表等。本文将探讨指针数组的基本概念及其多种应用,并通过几个实际例子来加深理解。

In C/C++ programming languages, a pointer array is a very powerful and flexible tool that allows programmers to create dynamic data structures, implement efficient string processing, construct function pointer tables, etc. This article will explore the basic concepts of pointer arrays and their various applications, and deepen understanding through several practical examples.

三、什么是指针数组?(What is a Pointer Array?)

前面的文章中,我们已对其进行了介绍,这里我们再次简要了解一下,指针数组是数组的一种,其中每个元素都是一个指针。这意味着它可以存储多个不同变量的地址,或者指向相同类型数据的一系列内存位置。例如,我们可以定义一个字符指针数组来保存多个字符串的起始地址,这在处理文本时特别有用。

In previous articles, we have already introduced this topic. Here, we will briefly review it again.A pointer array is a type of array where each element is a pointer. This means it can store the addresses of multiple different variables or point to a series of memory locations of the same data type. For example, we can define a character pointer array to save the starting addresses of multiple strings, which is especially useful when handling text.

在这个例子中,strArray是一个字符指针数组,每个元素都指向一个以null结尾的字符串常量。

In this example, strArray is an array of character pointers, where each element points to a null-terminated string constant.

四、指针数组的应用(Applications of Pointer Arrays)

字符串处理:如前所述,指针数组可以用来存储和管理多个字符串。这对于需要频繁操作字符串的程序(如文本编辑器或编译器)来说是非常方便的。

函数指针表:指针数组也可以包含函数指针,这使得我们能够根据条件调用不同的函数,从而实现多态性或命令模式。

动态分配二维数组:通过指针数组,我们可以轻松地为二维数组分配和释放内存,而不需要使用静态数组,这样可以节省内存并且更加灵活。

链表和其他复杂数据结构:指针数组还可以用于构建更复杂的自定义数据结构,如链表、树和图,这些结构对于解决特定问题至关重要。

String Processing: As mentioned earlier, pointer arrays can be used to store and manage multiple strings. This is particularly convenient for programs that frequently manipulate strings, such as text editors or compilers.

Function Pointer Tables: Pointer arrays can also contain function pointers, allowing us to call different functions based on conditions, thus achieving polymorphism or command patterns.

Dynamic Allocation of Two-Dimensional Arrays: Through pointer arrays, we can easily allocate and release memory for two-dimensional arrays without using static arrays, saving memory and offering greater flexibility.

Linked Lists and Other Complex Data Structures: Pointer arrays can also be used to build more complex custom data structures like linked lists, trees, and graphs, which are crucial for solving specific problems.

实例:使用指针数组进行排序

下面的例子展示了如何使用指针数组对字符串进行排序:

Example: Sorting Strings Using a Pointer Array

The following example shows how to sort strings using a pointer array:

此代码片段首先定义了一个字符指针数组names,然后实现了sortStrings函数来对该数组进行排序。请注意,这里交换的是指针而不是字符串本身,因此效率较高。

This code snippet first defines a character pointer array names, then implements the sortStrings function to sort this array. Note that what\’s being swapped here are the pointers, not the strings themselves, making the operation more efficient.

今天的分享就到这里了。

如果您对文章有独特的想法,

欢迎给我们留言,

让我们相约明天。

祝您今天过得开心快乐!

That\’s all for today\’s sharing.

If you have a unique idea about the article,

please leave us a message,

Let us meet tomorrow.

I wish you a happy day today!

参 考 资 料:通义千问

参考文献:Kernighan, B. W., & Ritchie, D. M. (1988). The C Programming Language (2nd ed.). Prentice Hall. ISBN 0-13-110362-8.

Stroustrup, B. (2013). The C++ Programming Language (4th ed.). Addison-Wesley. ISBN 978-0321563842.

Prata, S. (2013). C Primer Plus (6th ed.). Addison-Wesley. ISBN 0-321-77640-2.

本文由LearningYard新学苑整理发出,如有侵权请在后台留言沟通!

LearningYard新学苑

文字:song

排版:song

审核|Yue

C语言基础知识:指针和数组的区别是什么?

在C语言教程中我们使用通过数组名通过偏移和指针偏移都可以遍历数组,那么指针和数组到底有什么区别??

由于数组中的数据在内存中都是连续存放的,数组名默认就是数组的首地址,也是一个特殊的指针;

1.通过 sizeof 获取大小

不管是数组还是指针变量,计算大小的时候都可以通过sizeof函数,注意两者使用的区别:

a.计算数组大小

数组所占存储空间的内存:sizeof(数组名);

数组的大小:sizeof(数组名)/sizeof(数据类型)

b.计算指针大小

在 32 位平台下,无论指针的类型是什么,sizeof(指针名)都是 4 ,在 64 位平台下,无论指针的类型是什么,sizeof(指针名)都是 8 ;

由此可见,sizeof函数计算指针大小的时候,与数据变量类型无关,x86平台下指针大小始终为4,x64平台下指针大小始终为8;

a.指针赋值

指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。

b.数组赋值

数组在内存中是连续存放的,开辟出一块连续的内存空间。数组可以根据数组的大小进行访问,多维数组实际上由多个一维数组构成,数组的赋值这里不再重复讲解。

常量:常量的值始终是固定的,不能被修改;

变量:变量的值可以任意修改;

那么指针和数组区别在哪呢?

写法一是正确的,常规操作;

写法二是错误的,数组名默认指向数组的首地址,是不能被修改的;

总结:所以说数组是指针常量,不能被修改;指针是变量可以被随意修改;

为了帮助大家,轻松,高效学习C语言/C++,给大家分享我收集的资源,从最零基础开始的,帮助大家在学习C语言的道路上披荆斩棘!

编程学习书籍分享:

编程学习视频分享:

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!大家也要把握住大学的时光,抓住成长的每一次机会哦~

对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。