C语言学习笔记--数组指针和指针数组
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语言学习笔记--数组指针和指针数组的更多相关文章
- C语言学习笔记(一):数组传递时退化为指针
这几天闲来无事,写了一个数组元素排序函数如下: #include <stdio.h> #include <stdlib.h> void ArraySort(int array[ ...
- c语言学习笔记(9)——指针
指针是c语言的灵魂 ----------------------------------------------------------------------------- # include &l ...
- 大一C语言学习笔记(7)---指针篇--什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?
"指针是C语言的灵魂"这句话一开始我没怎么明白,现在接触了指针,终于知道为什么这么说了,因为....难,真难:下面说一下我对这句话的见解: C语言拥有着其他语言所没有的特性---直 ...
- 大一C语言学习笔记(9)---指针篇--从”内存的使用“和“流程控制”的角度来理解“指针变量的使用‘
#深入理解指针变量 举个错误栗子: //以下代码的目的是输出100和1000,但输出结果只有一个100 #include<stdio.h> #include<malloc.h> ...
- 大一C语言学习笔记(8)---指针篇--动态内存是什么?与静态内存有什么区别?怎么使用动态内存,有什么需要注意的地方?
静态内存指的是在编译时系统自动给其分配的内存,运行结束后会自动释放:静态内存是在栈中分配的: 动态内存是我们程序员手动分配的内存,正常情况下,程序运行结束后,也不会自动释放,所以为了避免发生未知的错误 ...
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
- Go语言学习笔记八: 数组
Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...
- GO语言学习笔记(一)
GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...
- Go语言学习笔记二: 变量
Go语言学习笔记二: 变量 今天又学了一招如何查看go的版本的命令:go version.另外上一个笔记中的代码还可以使用go run hello.go来运行,只是这种方式不会生成exe文件. 定义变 ...
- Go语言学习笔记(1)——顺序编程
Go语言学习笔记这一堆主要是<Go语言编程>(人民邮电出版社)的读书笔记.中间会穿插一些零碎的点,比如源码学习之类的.大概就是这样吧. 1. 顺序编程 1.1 变量 变量的声明: var ...
随机推荐
- aodh M版本新特性 - Remove eventlet from Aodh in favour of threaded approach
在 Kilo版本, API WSGI application 可以有以下2种部署方式: As a Python command that runs a Werkzeug-based web serve ...
- postgresql查看数据库占用的物理存储空间大小
1.手动查看: 查看数据库postgres的oid postgres=# SELECT oid from pg_database where datname='postgres'; oid------ ...
- linux防火墙开关
对于普通Linux机器开关防火墙命令: 1重启后生效 chkconfig iptables off chkconfig iptables on 2即时生效 serivce iptables statu ...
- 网页seo
两大 网站布局和代码编辑 网站结构布局优化 1.控制首页链接数量 100以内2.偏平化的目录层次 百度蜘蛛点三次 超过三次,找不到结果. 导航SEO优化导航最好是文字 图片最好都加上 title 和a ...
- php 策略模式案例
策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境. eg:假如有一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有的广告位展示不同的广告.在传统的代码中,都是在 ...
- spring: 使用嵌入式数据源 EmbeddedDatabaseBuilder
嵌入式数据源作为应用的一部分运行,非常适合在开发和测试环境中使用,但是不适合用于生产环境.因为在使用嵌入式数据源的情况下,你可以在每次应用启动或者每次运行单元测试之前初始化测试数据. 使用Spring ...
- Install nginx on ubuntu
1. Install libpcre3, libpcre3-dev2. Install zlib1g-dev3. Download nginx and unzip it4. ./configure5. ...
- SDK中常用的工具
Android SDK包含了各种各样的定制工具,简介如下: 一.Android模拟器(Android Emulator )它是在你的计算机上运行的一个虚拟移动设备.你可以使用模拟器来在一个实际的And ...
- C++string类整理
string类 string类 头文件:#include<string> 名称空间:using namespace std; 初始化: string Str; String类的构造函数和析 ...
- linux shell 学习笔记--内部命令学习
.基本命令 新手必须要掌握的初级命令 ls 基本的列出所有文件的命令.但是往往就是因为这个命令太简单,所以我们总是低估它.比如 ,用 -R 选项,这是递归选项,ls 将会以目录树的形式列出所有文件, ...