C 语言中的数组有自己特定的类型,数组的类型由元素类型和数组大小共同决定。(如 int array[5]类型为 int[5])

1.定义数组类型

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

(1)数组类型:如 typedef int (AINT5)[5]; typedef float (AFLOAT10)[10];

(2)数组定义:AINT5 iArray; AFLOAT10 fArray;

2.数组指针

(1)数组指针用于指向一个数组

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

(3)通过将&作用于数组名可以得到数组的起始地址

(4)定义数组指针的两种方式:

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

②可以直接定义:type (*pointer)[n]; //其中 pointer 为数组指针变量名,type 为数组的元素类型,n 为数组的大小

#include <stdio.h>typedef int (AINT5)[5];       //数组类型:int[5]
typedef float (AFLOAT10)[10]; //数组类型:float[10]
typedef char (ACHAR9)[9];     //数组类型:char[9]int main(){AINT5 a1;  //定义变量a1为int[5]类型的数组float fArray[10];//普通定义数组的方法AFLOAT10* pf = &fArray;//合法。&表示取的是整个数组地址(相当于//float[10]类型的数组指针。
    ACHAR9 cArray;char(*pc)[9] = &cArray;//定义pc指针,并指向cArray数组。类型一致,合法。//char(*pcw)[4] = cArray;//错误,数组名cArray为首元素的地址(相当于char*)与pcw指针类型不匹配char(*pcw)[4] = (char(*)[4])cArray;int i = 0;printf("%d, %d\n", sizeof(AINT5),sizeof(a1));//4*5=20for(i=0; i<10; i++){(*pf)[i] = (float)i; //pf指向整个数组,即相当于&a。而*pf等价于(*&a),即相当于a//即*pf等价于数组名fArray,所以表达式相当于fArray[i] = (float)i;
    }printf("pf = %X, pf + 1 = %X\n", pf, pf+1); //pf + 1,指向数组最后一个元素的后面for(i=0; i<10; i++){printf("%f\n",fArray[i]);//打印0到9
    }printf("%p, %p ,%p\n", &cArray, pc+1, pcw+1);//pc+1==>(unsigned int)pc + 1*sizeof(*pc)//    ==>(unsigned int)pc + 1*9//同理pcw + 1 = pcw + 4return 0;
}

2.指针数组

(1)指针数组是一个普通的数组,其中的每个元素为一个指针

(2)指针数组的定义:type* pArray[n];//其中的 type*为数组中元素的类型,pArray为数组名,n 为数组的大小(如 float* a[3])

#include <stdio.h>
#include <string.h>//sizeof(a)表示整个元素的大小
//a表示首元素地址,*a即取出第1个元素
#define DIM(a) (sizeof(a)/sizeof(*a))//table指向一个指针数组,即每个元素为指针类型
int lookup_keyword(const char* key, const char* table[], const int size)
{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)));//4printf("%d\n", lookup_keyword("main",keyword,DIM(keyword))); //-1return 0;
}

参考资料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html

转载于:https://www.cnblogs.com/CoderTian/p/5907895.html

C语言学习笔记--数组指针和指针数组相关推荐

  1. C语言学习笔记09-数组、字符数组、字符串数组、二维数组(单字符输入输出putchar、getchar,字符串输入输出的scanf、gets、puts)

    C语言数组   数组作用:可以用来保存很多记录(可以看成一种大容器).一些简单游戏也基本由数组实现,如游戏地图(二维数组)等等.   一个数组 划分 多个单元(下标区分) -存放-> 多个同类元 ...

  2. C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针

    目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...

  3. c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...

    目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...

  4. 翁恺老师C语言学习笔记(十)指针_指针与数组

    传入函数的数组成了什么? · 当我们向一段函数传入数组变量,参数接收到的是值,如果我们传入指针时,参数接收到的是也是值(一个地址): · 如果传入函数的是一个普通变量,它接收到的是一个值 · 如果传入 ...

  5. c语言putchar_C语言学习笔记(三)指针

    0 往期链接 Chenglin Li:C语言学习(一)全部知识点 Chenglin Li:C语言学习(二)指针函数分配内存 1 指针 指针式C语言中的一个重要概念,也是C语言的一个重要特色. 指针可以 ...

  6. 翁恺老师C语言学习笔记(十)指针_指针运算

    我们先看一段代码 #include <stdio.h>int main(void) {char ac[] = {0,1,2,3,4,5,6,7,8,9,};char *p = ac;pri ...

  7. C语言学习笔记---指向函数的指针

      在内存中函数的存放也是一段连续的内存,函数名就是指向改内存中的首地址,所以也可以将这个函数的首地址赋给一个指针变量,这样通过指针变量就可以访问改函数.   那么为什么要通过指针来访问函数呢?下面通 ...

  8. 翁恺老师C语言学习笔记(十)指针_指针的使用

    指针的应用场景一 · 交换两个变量的值 void swap(int *pa, int *pb);//定义指针*pa和*pb int main(void) {int a = 5; int b = 6;s ...

  9. 翁恺老师C语言学习笔记(十)指针_指针变量就是记录地址的变量

    指针变量就是记录地址的变量 scanf函数 · 如果能够将取得的变量的地址传递给一个函数,能否通过这个地址在那个函数内访问这个变量 · scanf("%d", &i) · ...

  10. Go语言学习笔记(三)---指针,运算符及流程控制

    4.2.8 指针 基本介绍:1)基本数据类型,变量存的就是值,也叫值类型.2)获取变量的地址,用&.3)指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值.4)获取指针类型所指向的 ...

最新文章

  1. 常用开源协议介绍以及开源软件规范列表
  2. 散列表查找的一个实例
  3. Android之解决PC浏览器访问手机服务端取assets目录下的文件页面显示不出来问题
  4. P1160-队列安排【链表】
  5. DataNucleus 3.0与Hibernate 3.5
  6. 怎样学习(3):迭代学习,精益求精
  7. LeetCode 6039. K 次增加后的最大乘积(优先队列)
  8. Rsync安装与配置
  9. 拓端tecdat|R语言分布滞后非线性模型(DLNM)研究发病率,死亡率和空气污染示例
  10. dism 分割镜像_UEFI安装win10 1809系统,拆分Windows 映像大于4G文件install.wim的官方教程(亲测完美)...
  11. c语言自动按键脚本,纯C语言写的按键驱动,将按键逻辑与按键处理事件分离~
  12. 5G网络规划解决方案
  13. 互联网赚钱指南!我是如何零成本空手套白狼?
  14. 【2016.11.28】纯HTML仿微博注册页面
  15. java 获取上周开始时间和结束时间,上上周开始和上上周结束时间
  16. 学员管理系统(面向对象版)
  17. iscc_2018 web题解
  18. 华为公司的管理者培养路径图
  19. 为什么计算机的网络id,网络ID、主机ID和子网掩码
  20. Kotlin协程序列:

热门文章

  1. 前端 CSS 变量简介及基本使用方法
  2. VMware Sphere 虚拟磁盘创建选项
  3. 2440 6.0BSP 移植过程之显示驱动篇
  4. python透明图片合并_如何使用PIL将透明png图像与另一个图像合并
  5. python3socket非阻塞在linux里无效_利用Python中SocketServer实现客户端与服务器间非阻塞通信方法介绍...
  6. memcached并发CAS模式
  7. Jaakko isalo谈《愤怒的小鸟》创意来源
  8. java建立有向弧,2015安徽省JAVA版数据结构考试题库
  9. db_mysql.so_MySQL登陆时提示找不到到libmysqlclient.so.15
  10. slqite3库查询数据处理方式_SQLite数据库使用 常用命令