011-一维数组本质及数组类型(指针)
本帖最后由 moc 于 2018-8-16 22:12 编辑1、数组基本概念
1)元素类型角度:数组是相同类型的变量的有序集合。
2)内存角度:数组是一大片连续的内存空间。
数组初始化:
①数组可以用一个列值来初始化,例如
int v1[] ={1,2,3,4};
char v2[]={'a','b','c',0};
②当数组定义时没有指定大小,当初始化采用列表初始化了,那么数组的大小由初始化时列表元素个数决定。所以v1和v2分别为 int 和char类型。如果明确指定了数组大小,当在初始化时指定的元素个数超过这个大小就会产生错误。例如:
char v3 ={'a','b',0}; //错误:太多的初始化值了
char v3 ={'a','b',0}; //正确
③如果初始化时指定的的元素个数比数组大小少,剩下的元素都会被初始化为 0。(int 数组会被初始化为0, 字符数组初始化为‘’?)例如
int v5={1,2,3,4}等价于 intv5={1,2,3,4,0,0,0,0};
int v6 = {0}等价于 int v6 = {0, 0, 0, 0,0};
int v7 = {1}等价于 int v7 = {1, 0, 0, 0,0};
④注意没有如下形式的数组赋值
v4={'c','d',0}; //错误:不是数组赋值
⑤字符数组可以方便地采用字符串直接初始化
charalpha []="abcdefghijklmn";
2、复杂数据类型之数组类型
int a = { 1, 2 };
就上面的a代表数组首元素的地址,它是个常量。她的类型是由数组首元素的类型决定的指针类型。
还有一个概念&a,它代表整个数组的地址,其数据类型是数组类型(一种复杂数据类型,其本质依旧是固定内存块旳大小),如(int )。
也可以定义数组类型(如int)别名(如MyArray5),此时MyArray5就跟int一样啦,是一种类型,也可用它去定义变量:
typedef int(MyArray5); // 定义了一种数组类型(int)为MyArray5
MyArray5 array5; // 相当于int array;
for (i=0; i<5; i++)
{
array5 = i + 10;
printf("%d ", array5);
}
printf("\n%d\n", sizeof(array5));
printf("\n%x\n%x\n%x\n%x\n%x",array5, array5+1, array5+4, &array5, &array5+1); //解决指针步长问题
printf("\n******\n");*\n");
可见数组名的类型是数组元素的类型的指针,加1只跳该类型的内存大小;&数组名是数组类型的指针,加1跳整个数组的内存大小。
3、数组类型的指针
数组类型指针定义的三种方法:
1.用数组类型 + * 直接定义;
MyArray5 *myp1;
2.先定义一个指向数组类型的指针类型,再用这个类型去定义数组类型指针;
typedef int(*arrayp5_1);// arrayp5_1 为一个数组类型指针(固定内存块大小的别名)
arrayp5_1 myp2; // myp2为指向数组类型的指针变量
3. 直接定义指向(整个)数组的指针变量
int c = { 1, 2, 43, 2, 11 };
int(*myp3) = &c; // myp3为指向(整个)数组c的指针变量
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
void main()
{
int a, i;
int *p = NULL;
p = &a;
// a1 代表数组首元素的地址,是(常量)指针变量,即常量指针
// 不能随便改变指针变量的值, 是一个const ,在定义a时,编译器为了能回收内存,已经把a1做成*const p型指针。
int a1 = { 1, 2, 43, 2, 11 };
// 声明一个数组类型(固定内存块大小的别名)
typedef int(MyArray5);
// 定义一个指向数组类型的指针变量
MyArray5 *myp1;
myp1 = &a1; // 给指向数组类型的指针变量赋值
// 用数组指针遍历数组
for (i = 0; i < 5; i++)
{
printf("%d ",(*(*myp1 + i)));//[]优先级高于*; a == *(a+i)-->(*pArray) == *(*pArray+i)
}
{
// 直接定义一个数组指针类型用这个类型直接定义指针变量
typedef int(*arrayp5_1);// arrayp5_1 为一个数组类型指针(固定内存块大小的别名)
int b = { 1, 2, 43, 2, 11 };
arrayp5_1 myp2 = &b; // myp2为指向(整个)数组b的指针变量
// 直接定义指向(整个)数组的指针变量
int c = { 1, 2, 43, 2, 11 };
int(*myp3) = &c; // myp3为指向(整个)数组c的指针变量
}
system("pause");
}
{:10_256:}{:10_256:}{:10_256:}{:10_256:}
页:
[1]