C语言 指针数组详解及示例代码

 更新时间:2016年08月23日 17:13:35   投稿:lqh  
本文主要介绍C语言 指针数组,这里提供详细的资料和简单示例代码以便大家学习参考,有需要学习的小伙伴可以参考下

如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组。指针数组的定义形式一般为:

dataType *arrayName[length];

[ ]的优先级高于*,该定义形式应该理解为:

dataType *(arrayName[length]);

括号里面说明arrayName是一个数组,包含了length个元素,括号外面说明每个元素的类型为dataType *。

除了每个元素的数据类型不同,指针数组和普通数组在其他方面都是一样的,下面是一个简单的例子:

#include <stdio.h>
int main(){
  int a = 16, b = 932, c = 100;
  //定义一个指针数组
  int *arr[3] = {&a, &b, &c};//也可以不指定长度,直接写作 int *parr[]
  //定义一个指向指针数组的指针
  int **parr = arr;
  printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);
  printf("%d, %d, %d\n", **(parr+0), **(parr+1), **(parr+2));
  return 0;
}

运行结果:

16, 932, 100
16, 932, 100

arr 是一个指针数组,它包含了 3 个元素,每个元素都是一个指针,在定义 arr 的同时,我们使用变量 a、b、c 的地址对它进行了初始化,这和普通数组是多么地类似。

parr 是指向数组 arr 的指针,确切地说是指向 arr 第 0 个元素的指针,它的定义形式应该理解为int *(*parr),括号中的*表示 parr 是一个指针,括号外面的int *表示 parr 指向的数据的类型。arr 第一个元素的类型为 int *,所以在定义 parr 时要加两个 *。

第一个 printf() 语句中,arr[i] 表示获取第 i 个元素的值,该元素是一个指针,还需要在前面增加一个 * 才能取得它指向的数据,也即 *arr[i] 的形式。

第二个 printf() 语句中,parr+i 表示第 i 个元素的地址,*(parr+i) 表示获取第 i 个元素的值(该元素是一个指针),**(parr+i) 表示获取第 i 个元素指向的数据。

指针数组还可以和字符串数组结合使用,请看下面的例子:

#include <stdio.h>
int main(){
  char *str[3] = {
    "c.biancheng.net",
    "C语言中文网",
    "C Language"
  };
  printf("%s\n%s\n%s\n", str[0], str[1], str[2]);
  return 0;
}

运行结果:

c.biancheng.net
C语言中文网
C Language

需要注意的是,字符数组 str 中存放的是字符串的首地址,不是字符串本身,字符串本身位于其他的内存区域,和字符数组是分开的。

也只有当指针数组中每个元素的类型都是char *时,才能像上面那样给指针数组赋值,其他类型不行。

为了便于理解,可以将上面的字符串数组改成下面的形式,它们都是等价的。

#include <stdio.h>
int main(){
  char *str0 = "c.biancheng.net";
  char *str1 = "C语言中文网";
  char *str2 = "C Language";
  char *str[3] = {str0, str1, str2};
  printf("%s\n%s\n%s\n", str[0], str[1], str[2]);
  return 0;
}

以上就是对 C语言指针数组的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

相关文章

  • 详解C++ functional库中的仿函数使用方法

    详解C++ functional库中的仿函数使用方法

    仿函数(functor)又称之为函数对象(function object),实际上就是 重载了()操作符 的 struct或class。本文将详细讲解C++中仿函数的使用方法,需要的可以参考一下
    2022-04-04
  • C++时间戳转化操作实例分析【涉及GMT与CST时区转化】

    C++时间戳转化操作实例分析【涉及GMT与CST时区转化】

    这篇文章主要介绍了C++时间戳转化操作,结合实例形式分析了C++时间戳转换与显示操作的原理与具体实现技巧,涉及GMT与CST时区转化,需要的朋友可以参考下
    2017-05-05
  • Cmake中强大的输出函数message示例解析

    Cmake中强大的输出函数message示例解析

    这篇文章主要介绍了Cmake中强大的输出函数message解析,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • C++基础入门教程(二):数据、变量、宏等

    C++基础入门教程(二):数据、变量、宏等

    这篇文章主要介绍了C++基础入门教程(二):数据、变量、宏等,本文讲解了变量初始化、宏定义、三种进制数的表示、const初探、auto声明等内容,需要的朋友可以参考下
    2014-11-11
  • C语言详解函数与指针的使用

    C语言详解函数与指针的使用

    C语言这门课程在计算机的基础教学中一直占有比较重要的地位,然而要想突破C语言的学习,对函数和指针的掌握是非常重要的,本文将具体针对函数和指针的关系做详尽的介绍
    2022-04-04
  • 设计模式中的备忘录模式解析及相关C++实例应用

    设计模式中的备忘录模式解析及相关C++实例应用

    这篇文章主要介绍了设计模式中的备忘录模式解析及相关C++实例应用,备忘录模式也经常被用来在命令模式中维护可以撤销(Undo)操作的状态,需要的朋友可以参考下
    2016-03-03
  • 详解C++ 重载运算符和重载函数

    详解C++ 重载运算符和重载函数

    这篇文章主要介绍了C++ 重载运算符和重载函数的的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Effective C++ 学习笔记

    Effective C++ 学习笔记

    这篇文章主要介绍了Effective C++ 学习笔记,想学习Effective C++的朋友可以参考一下
    2023-08-08
  • C语言杨氏矩阵查找算法实例讲解

    C语言杨氏矩阵查找算法实例讲解

    杨氏矩阵是一个数字矩阵,矩阵的每一行从左到右一次递增,矩阵从上到下递增,在这样的矩阵中查找一个数字是否存在。时间复杂度小于O(N),有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-09-09
  • C/C++可变参数函数的实现

    C/C++可变参数函数的实现

    这篇文章主要介绍了C/C++可变参数函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04

最新评论