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

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 = -; 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))); //-1 return ;
}

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

C语言学习笔记--数组指针和指针数组的更多相关文章

  1. C语言学习笔记(一):数组传递时退化为指针

    这几天闲来无事,写了一个数组元素排序函数如下: #include <stdio.h> #include <stdlib.h> void ArraySort(int array[ ...

  2. c语言学习笔记(9)——指针

    指针是c语言的灵魂 ----------------------------------------------------------------------------- # include &l ...

  3. 大一C语言学习笔记(7)---指针篇--什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?

    "指针是C语言的灵魂"这句话一开始我没怎么明白,现在接触了指针,终于知道为什么这么说了,因为....难,真难:下面说一下我对这句话的见解: C语言拥有着其他语言所没有的特性---直 ...

  4. 大一C语言学习笔记(9)---指针篇--从”内存的使用“和“流程控制”的角度来理解“指针变量的使用‘

    #深入理解指针变量 举个错误栗子: //以下代码的目的是输出100和1000,但输出结果只有一个100 #include<stdio.h> #include<malloc.h> ...

  5. 大一C语言学习笔记(8)---指针篇--动态内存是什么?与静态内存有什么区别?怎么使用动态内存,有什么需要注意的地方?

    静态内存指的是在编译时系统自动给其分配的内存,运行结束后会自动释放:静态内存是在栈中分配的: 动态内存是我们程序员手动分配的内存,正常情况下,程序运行结束后,也不会自动释放,所以为了避免发生未知的错误 ...

  6. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  7. Go语言学习笔记八: 数组

    Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...

  8. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  9. Go语言学习笔记二: 变量

    Go语言学习笔记二: 变量 今天又学了一招如何查看go的版本的命令:go version.另外上一个笔记中的代码还可以使用go run hello.go来运行,只是这种方式不会生成exe文件. 定义变 ...

  10. Go语言学习笔记(1)——顺序编程

    Go语言学习笔记这一堆主要是<Go语言编程>(人民邮电出版社)的读书笔记.中间会穿插一些零碎的点,比如源码学习之类的.大概就是这样吧. 1. 顺序编程 1.1 变量 变量的声明: var ...

随机推荐

  1. monkey参数应用

    1.指定seed值 adb shell monkey -v -p package -s 100  100 2.touch事件(参数后都跟百分比) 3.设定动作百分比 4.轨迹球 5.基本导航事件 输入 ...

  2. 《Think in Java》(八)多态

    "封装"通过合并特征和行为来创建新的数据类型: "实现隐藏"通过将细节"私有化"把接口和实现分离开来: "多态"消除类型 ...

  3. 2017-03-01 Oracle10g的安装与配置使用

    今天项目中又用到了Oracle,时隔三年没有碰过Oracle,之前在做某城市公共自行车管理系统时使用的是Orace10g版本,Oracle给我最大的感觉就是安装上以后,电脑就会变得很卡,所以大家当不使 ...

  4. [eBook]Inside Microsoft Dynamics AX 2012 R3发布

    最近一本关于Microsoft Dynamics AX 2012开发的书<Inside Microsoft Dynamics AX 2012 R3> 发布. Book Descriptio ...

  5. 如何理解python中的if __name__=='main'的作用

    一. 一个浅显易懂的比喻 我们在学习python编程时,不可避免的会遇到if __name__=='main'这样的语句,它到底有什么作用呢? <如何简单地理解Python中的if __name ...

  6. 在Android中使用实时调度(real-time)

    Linux的线程调度策略中有FIFO和RT的实时调度方法,但是在Android中做了限制,普通用户不能修改线程的调度算法为FIFO和RT,必须ROOT用户才能更改.但问题是程序是以普通用户启动和运行的 ...

  7. SFTP 利用对称公钥免密码的方法

    在客户端的操作: #cd .ssh             进入.ssh目录 #ssh-keygen -t rsa   执行创建密钥对命令 Generating public/private rsa ...

  8. Linux下tar命令的各种参数选项和他们的作用整理

    1.建立TAR包(打包)命令格式:tar cvf TAR包文件名.tar 所备份的文件或目录功能描述:tar cvf命令用于把指定的目录或文件打包到指定的文件中.“c”指定建立(或压缩)TAR包,“v ...

  9. PHP提供的数组比较函数总结

    在我们看PHP手册的时候发现,PHP提供了许多数组元素比较的函数,看起来又多又烦又不好记,现在我们来总结一下: sort() — 本函数对数组进行排序,当本函数结束时数组单元将被从最低到最高重新安排. ...

  10. UDP10040 和 setsockopt设置大全

    今天无意之中碰到 UDP 10040 错误  原来是缓冲区不够,以下转载的解决方法以供不时之需.   1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该sock ...