一、数组的定义及使用及分类
1、数组是用来存放一组数据的,而因为存放的数据可以分为不同种类,数组也分为不同种:int,float,double ,char......
2、定义数组的方式和定义一个变量相似,都是数据类型+数组名[](变量名),数组长度可写可不写;在定义数组时如给予一定的长度,一定要分配足够的内存空间,确保所保存的数据不会越界(数组越界将会使用非法内存导致危险);
3、在一维数组名arr,表示整个数组时只有如下情况:
(1)为防止数组长度判断出错时,在定义数组的同一函数中可以用len=sizeof(arr)/sizeof(arr[0])来求出数组长度;
(2)在定义数组的同一个函数中,&arr+1,加整个数组的大小
(3)而在其他情况中,数组名代表的首元素的地址
4、在被调用函数中,形参数组被退化成指针(在本质上:数组在形参中已经是指针),同时在传递数组时同时需要传递数组长度(字符串数组除外,因为在字符串数组中有明显的‘\0’标志作为结束标志)
5、使用数组的方式数组名[下标]={存放的数据},下标是从0开始的,
在定义数组中数组名[len];
二、指针
1、指针通俗的讲就是地址
Int *p=&a//定义一个整型指针,将整型地址值放入整型指针变量中
(*的第一作用:在定义中起到说明是指针)
*p=100//将a的值赋值为100
(*的第二作用:解引用,通俗讲就是间接访问符)
Int **pp=&p//定义一个二级指针,(就是定义一个指针变量存放之前指针p的地址)
**pp=100//通过俩次解引用将a的值赋值为100
Int ***ppp=&pp//定义一个三级指针,(就是定义一个指针变量存放之前指针pp的地址)
***ppp=100//通过三次解引用将a的值赋值为100;
2、指针分配的内存空间
指针的内存空间由平台决定,与数据类型无关,所以数据类型不影响指针的内存空间大小
Cpu->os->编译器(每一个都是由它前一个所决定,呈金字塔型)
32(64)位操作平台:指针4(8)个字节
3、指针的运算
(1)p++:是指加的一个单元格(而单元格由数据类型决定),所以指针运算需要调整权重(调整权重即为去掉一个*,求sizeof)
(2)指针—指针=相差多少个单元格(调整权重)
(3)其他指针运算不存在,且指针的运算都需要调整权重
int arr[10];
int *q = &arr[9];//x+36
int *p= &arr[1];//x+4
printf("%d\n",q-p);//8
printf("%d\n",(char *)q-(char *)p);//32
printf("%d\n",(short **)q-(short **)p);//8
printf("%d\n",(double *)q-(double *)p);//4
printf("%d\n",(unsigned long long)q-(unsigned long long)p);//32
int *p = (int *)0x2010;
printf("%x\n",p-2);//2008
printf("%x\n",(char *)p-2);//200e
printf("%x\n",(short *)p-2);//200c
printf("%x\n",(double *)p-2);//2000
printf("%x\n",(char ***)p-2);//2008
printf("%x\n",(unsigned long)p-2);//200e
int *p = (int *)100;
printf("%d\n",p+4);//100+4*sizeof(int)=116
printf("%d\n",(char *)p+4);//104
printf("%d\n",(short *)p+4);//108,
printf("%d\n",(double *)p+4);//132
printf("%d\n",(char **)p+4);//116
printf("%d\n",(double ***)p+4);//116
printf("%d\n",(long long)p+4);//104