C语言深入分析数组指针和指针数组的应用

 更新时间:2022年04月18日 15:49:48   作者:清风自在 流水潺潺  
在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活

一、数组类型

  • C语言中的数组有自己特定的类型
  • 数组的类型由元素类型和数组大小共同决定

例:int array[5] 的类型为 int[5]

二、定义数据类型

C语言中通过 typedef 为数组类型重命名:typedef type(name)[size];

数组类型:

typedef int(AINT5)[5];

typedef float(AFLOAT10)[10];

数组定义:

AINT5 iArray;

AFLOAT10 fArray;

三、数组指针

  • 数组指针用于指向一个数组
  • 数组名是数组首元素的起始地址,但并不是数组的起始地址
  • 通过将取地址符 & 作用于数组名可以得到数组的起始地址
  • 可通过数组类型定义数组指针:ArrayType* pointer;
  • 也可以直接定义:type(*pointer)[n];

pointer 为数组指针变量名,type 为指向的数组的元素类型,n 为指向的数组的大小

下面看一个数组指针的示例:

#include <stdio.h>
 
typedef int(AINT5)[5];
typedef float(AFLOAT10)[10];
typedef char(ACHAR9)[9];
 
int main()
{
    AINT5 a1;
    float fArray[10];
    AFLOAT10* pf = &fArray;
    ACHAR9 cArray;
    
    char(*pc)[9] = &cArray;
    char(*pcw)[4] = cArray;   
    
    int i = 0;
    
    printf("%d, %d\n", sizeof(AINT5), sizeof(a1));
    
    for (i = 0; i < 10; i++)
    {
        (*pf)[i] = i;   // ==> fArray[i] = i;
    }
    
    for(i = 0; i < 10; i++)
    {
        printf("%f\n", fArray[i]);
    }
    
    printf("%p, %p, %p\n", &cArray, pc + 1, pcw + 1);
    
    return 0;
}

输出结果如下:

注意char(*pcw)[4] = cArray; 是不对的,cArray 数组名代表的地址是首元素的地址,类型为 char* ,而 pcw 指针类型为 char[4],所以这样就不合法。

四、指针数组

  • 指针数组是一个普通的数组
  • 指针数组中每个元素为一个指针
  • 数组的定义:type* pArray[n];

type*为数组中每个元素的类型,pArray为数组名,n 为数组大小

例如:

下面看一个指针数组的应用:

#include <stdio.h>
#include <string.h>
 
#define DIM(a) (sizeof(a) / sizeof(*a))
 
int lookup_keyword(const char* key, const char* table[], const int size)    // const char* table[] <==> const char** table
{
    int ret = -1;
    int i = 0;
    for (i = 0; i < size; i++)
    {
        if(strcmp(key, table[i]) == 0)
        {
            ret = i;
            break;
        }
    }
    return ret;
}
 
int main()
{
    const char* keyword[] = {
        "do",
        "for",
        "if",
        "register",
        "return",
        "switch",
        "while",
        "case",
        "static"
    };
    
    printf("%d\n", lookup_keyword("return", keyword, DIM(keyword)));
    printf("%d\n", lookup_keyword("main", keyword, DIM(keyword)));
    
    return 0;
}

输出结果如下:

注意const char* table[ ] <==> const char** table ,两种写法都可以,只是 const char* table[ ] 更直观

五、小结

  • 数组的类型由元素类型和数组大小共同决定
  • 数组指针是一个指针,指向对应类型的数组
  • 指针数组是一个数组,其中每个元素都为指针
  • 数组指针遵循指针运算法则
  • 指针数组拥有C语言数组的各种特性

到此这篇关于C语言深入分析数组指针和指针数组的应用的文章就介绍到这了,更多相关C语言 数组指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现LeetCode(191.位1的个数)

    C++实现LeetCode(191.位1的个数)

    这篇文章主要介绍了C++实现LeetCode(191.位1的个数),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 基于C语言实现UDP客户端

    基于C语言实现UDP客户端

    UDP是一种面向无连接的传输层协议,广泛应用于实时性要求较高的场景,本文将介绍如何使用C语言实现一个简单的UDP客户端程序,有需要的可以参考下
    2024-10-10
  • C++文件读和写的使用

    C++文件读和写的使用

    本文主要介绍了C++文件读和写的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • c++中new的三种用法详细解析

    c++中new的三种用法详细解析

    以下的是对c++中new的三种使用方法进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-09-09
  • 使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小(最新推荐)

    使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小(最新推荐)

    这篇文章主要介绍了使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • C++之内存分配new与delete使用方式

    C++之内存分配new与delete使用方式

    这篇文章主要介绍了C++之内存分配new与delete使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • C++变量和基本类型详解

    C++变量和基本类型详解

    这篇文章主要介绍了C++变量和基本类型,,一定要注意局部变量与全局变量的作用范围,需要的朋友可以参考下,希望能够给你带来帮助
    2021-10-10
  • C语言实现ATM系统程序的完整代码

    C语言实现ATM系统程序的完整代码

    这篇文章主要介绍了C语言实现ATM系统程序的完整代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • C++ 命名空间避免命名冲突的实现

    C++ 命名空间避免命名冲突的实现

    命名空间是C++中用来避免命名冲突的一种机制,本文主要介绍了C++ 命名空间避免命名冲突的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • QT读写Sqlite数据库的三种方式

    QT读写Sqlite数据库的三种方式

    Sqlite是一个比较小型的本地数据库,对于保存一些软件配置参数或量不是很大的数据是相当的方便,Qt本身已经自带了Sqlite的驱动,直接使用相关的类库即可,这篇我们主要来说明QT访问Sqlite数据库的三种方式,需要的朋友可以参考下
    2024-03-03

最新评论