1、思考

下面这些声明合法吗?

  int array[5];

  int matrix[3][3];

  int * pa = array;

  int * pm = matrix;

问题:

  array代表数组首元素的地址,那么matrix代表什么?

  array和&array的地址值相同,但是意义不同,那么它们所代表的类型相同吗?

2、数组类型

  C语言中的数组有自己特定的类型

  数组的类型由元素类型和数组大小共同决定

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

3、定义数组类型

C语言中通过typedef为数组类型重命名

   typedef type(name)[size]; 

数组类型:

   typedef int(AINT5)[];
2 typedef float(AFLOAT10)[];

数组定义:

   AINT5 iArray; 

   AFLOAT10 fArray;

4、数组指针

数组指针用于指向—个数组

数组名是数组首元素的起始地址,但并不是数组的起始地址

通过将取地址符&作用于数组名可以得到数组的起始地址

可通过数组类型定义数组指针: ArrayType* pointer;

也可以直接定义: type(*pointer) [n];

- pointer为数组指针变量名

- type为指向的数组的元素类型

- n为指向的数组的大小

5、实例分析

数组类型和数组指针      32-1.c

 #include <stdio.h>  
  
typedef int(AINT5)[];  
typedef float(AFLOAT10)[];  
typedef char(ACHAR9)[];  
  
int main()  
{  
    AINT5 a1;  
    float fArray[];  
    AFLOAT10* pf = &fArray;  //数组指针
    ACHAR9 cArray;  
    char(*pc)[] = &cArray;  //定义一个数组指针并用cArray数组的地址初始化
    char(*pcw)[] = cArray;  //warning or error 数组首元素地址为char* 初始化char(*)[4]
      
    int i = ;  
      
    printf("%d, %d\n", sizeof(AINT5), sizeof(a1));  //20,20
      
    for(i=; i<; i++)  
    {  
        (*pf)[i] = i;  
    }  
      
    for(i=; i<; i++)  
    {  
        printf("%f\n", fArray[i]);  
    }  
      
    printf("%p, %p, %p\n", &cArray, pc+, pcw+);  //(unsigned int)pc + 1*9
  
    return ;  
}  

数组首元素的地址为int* 类型,而数组的地址为int(*)[5]类型

pc+1=(unsigned int)pc+sizeof(*pc)=0xbfdce3ac

pcw+1=(unsigned int)pcw+sizeof(*pcw)=0xbfdce3a7

6、指针数组

指针数组是—个普通的数组

指针数组中每个元素为—个指针

指针数组的定义: type* pArray[n];

- type它为数组中每个元素的类型

- pArray为数组名

- n为数组大小

7、实例分析

指针数组的应用     32-2.c

 #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)  
{  
    int ret = -;  
      
    int i = ;  
      
    for(i=; i<size; i++)  
    {  
        if( strcmp(key, table[i]) ==  )  
        {  
            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 ;  
}  

const char* table[]作参数实际会退化为const char** table

8、小结

数组的类型由元素类型和数组大小共同决定

数组指针是—个指针,指向对应类型的数组

指针数组是—个数组,其中每个元素都为指针

数组指针遵循指针运算法则

指针数组拥有C语言数组的各种特性

C语言-数组指针与指针数组的更多相关文章

  1. C语言学习笔记之成员数组和指针

    成员数组和指针是我们c语言中一个非常重要的知识点,记得以前在大学时老师一直要我们做这类的练习了,但是最的还是忘记了,今天来恶补一下.     单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个 ...

  2. C语言中字符数组和字符串指针分析

    这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么 用到过C,虽然网上这类的文章也有很多,还是决定自己在这 ...

  3. 对于C语言中数组名是指针的理解

    我们都知道,c语言中数组名是一个指针,比如下面这段代码 #include<iostream>using namespace std;int main(){ int a[4]={1,2,3, ...

  4. 《C语言学习笔记》指针数组及其应用

    C语言中,最灵活但又容易出错的莫过于指针了.而指针数组,是在C中很常见的一个应用.指针数组的意思是说,这个数组存储的所有对象都为指针.除了存储对象为指针,即一个地址外,其它操作和普通数组完全一样. # ...

  5. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  6. C语言中的函数、数组与指针

    1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:  函 ...

  7. 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

    . Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...

  8. 别人不会给你说的---C语言中数组名和指针的区别 及 sizeof用法

    引自: http://blog.csdn.net/tianyue168/article/details/5781924 #i nclude <iostream.h> int  main( ...

  9. C/C++——C语言数组名与指针

    版权声明:原创文章,转载请注明出处. 1. 一维数组名与指针 对于一维数组来说,数组名就是指向该数组首地址的指针,对于: ]; array就是该数组的首地址,如果我们想定义一个指向该数组的指针,我们可 ...

  10. 【C语言】-指向一维数组元素的指针

    本文目录 一.用指针指向一维数组的元素 二.用指针遍历数组元素 三.指针与数组的总结 四.数组.指针与函数参数 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能 ...

随机推荐

  1. R语言入门:使用RStudio的基本操作

    R语言在人工智能,统计学,机器学习,量化投资,以及生物信息学方面有着十分广泛的运用.也是我大学的必修课,因此这里梳理一些有关R语言的知识点,做做记录. 首先我们需要知道R语言的工作区域,R语言默认的工 ...

  2. MVC的App_Data中看不到数据库mdf文件

    点击运行后的页面去注册个账号,然后点击解决方案的‘显示所有文件就能看到了

  3. CLion快捷键设置

    CLion自动格式化的快捷键默认为Ctrl+Alt+L,代码前后跳转CRTL+ALT+Left或CRTL+ALT+Right 但有时会和系统的快捷键冲突,需要修改CLion里面的快捷键 如图:sett ...

  4. 【Debian学徒记事】Debian快速呼出Terminal终端

    Debian快速呼出Terminal终端 书接上回,Debian已经安装完毕 失踪的Ctrl+Alt+T 安装完毕启动,我发现了剑很诡异的事,Ctrl+Alt+T居然失灵了 (在多次测试后发现,Deb ...

  5. 一维数组、二维数组——Java

    一. 一维数组 1.  数组是相同类型数据的有序集合 相同类型的若干个数据,按照一定先后次序排列组合而成 每个数组元素可以通过一个下标来访问它们 其中,每一个数据称作一个数组元素 2. 数组特点: 其 ...

  6. ADB之安装APK

    一.下载安装adb工具 下载安装,cmd测试是否成功 二.连接设备 1.手机打开USB测试 2.测试连接 三.安装应用 adb -s [设备编号] install [apk的完整路径]  

  7. 【BZOJ 1022】 [SHOI2008]小约翰的游戏John(Anti_SG)

    Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取 的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不 ...

  8. 题解【AcWing1089】烽火传递

    题面 单调队列优化 DP 模板题. 我们考虑设 \(dp_{i}\) 表示从 \(1\) 到 \(i\) 能够准确传递情报,且第 \(i\) 个烽火台发出信号的最小费用. 转移方程不难得出:\(dp_ ...

  9. VPS性能测试shell工具以及锐速安装

    比较熟悉的UnixBench非常耗费资源,需要长时间跑满cpu和IO,很多主机商都深恶痛绝,会做各种限制,其实也代表不了实际使用的业务效果,毕竟真正需要那么多cpu和IO的应用并不多.而网络状况却是大 ...

  10. JavaSE学习笔记(1)---数据类型、运算符、控制结构

    javaSE学习笔记(1) 数据类型和运算符 1.注释可以提高程序的可读性.可划分为 单行注释 // 多行注释 /.../ 文档注释 /**...*/ 2.标识符的命名规则: 标识符必须以字母.下划线 ...