一、数组指针:
《1》数组:
从内存角度来说,数组是一片连续的内存空间,用来存放相同的数据类型元素;
《2》了解
int a[100]={0};//编译期间 赋值为0, 速度快
memset( a , 0 , sizeof(a) );//手动赋值,速度次之俄回收内存,也为了有机会让编译器拿到原始内存地址,编译器将a做为const量,也就是说,不可改变a
//如:a=oxff11;这是错误的
//在定义a[100]时,编译器会自动分配内存,为了能够顺利d
《3》数组的解释
int array[10]={1,2,3,4,5,6,7,8,9,0};
//数组名array退化为数组首元素地址,不是整个数组的地址
// 数组名取地址,&array代表整个数组的地址;
//&array和array代表的数据类型不一样,其步长也就不一样(加 1 的效果不一样)
//&array代表数组类型,array代表数组首元素类型
《4》数组类型
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
int i;
int a;
typedef int (Array)[5];
Array array;
for(i=0;i<5;i++)
{
array[i]=i;
}
for(i=0;i<5;i++)
{
printf("%d\n",array[i]);
}
printf("%d\n",sizeof(array));//求数组的大小
printf("%d\n",sizeof(Array));//求数组类型的大小
printf("%d,%d\n",&array,&array+1);//查看步长
system("pause");
}
《4.1》typedef int (Array)[6];
《4.2》typedef int (Array)[5];
《5》数组指针的三种定义方式
//定义数组指针有三种:
//1)通过数组类型定义数组指针:
typedef int(ArrayType)[5];
ArrayType* pointer;
//2) 声明一个数组指针类型 :
typedef int (*MyPointer)[5];
MyPointer myPoint;
//3)直接定义:
int (*pointer)[n];
pointer 为数组指针变量名
type 为指向的数组的类型
n 为指向的数组的大小
注意这个地方是type类型(比如 int (*pointer)[10])
程序实现:
#include<stdio.h>//三种方式的头文件均定义与此
#include<stdlib.h>
#include<string.h>
(1)第一种定义数组指针的方式
void main()
{
int i;
int a;//引例,定义整形变量a
int *p=&a; //定义整形指针变量p,将a的地址赋给p
typedef int(MyArray1)[5];//使用typedef声明一个数组类型;
int a1[5]={1,2,3,4,5};//定义一个整形数组 a1
MyArray1* parra = &a1;//定义一个数组指针变量parra,将a1的地址赋给它
//注意parra用于存放一级指针的地址,故而是一个二级指针
for(i=0;i<5;i++)
{
(*parra)[i]=i;//通过数组指针,来初始化
}
for(i=0;i<5;i++)
{
printf("%d\n",(*parra)[i]);//打印每次初始化结果
}
system("pause");
}
(2)第二种定义数组指针的方式
我们知道,可以通过直接定义指针类型,来定义指针变量,如结构体中,
typedef struct _teacher
{
char name[64];
int age;
}teacher,*pteacher;
//在主调函数中,可以直接利用*pteacher来定义指针;如:
ptecher p1;
那么能否适用于数组指针呢? 下面,我们来看一看:
void main()
{
int i;
int b[5]={1,2,3,4,5};
typedef int (* Pmyarrb)[5];//声明数组指针类型
Pmyarrb pb = &b;//用已声明的数组指针类型定义指针变量pb,再将b的地址赋给该指针
for(i=5;i<10;i++)
{
(*pb)[i]=i;
}
for(i=5;i<10;i++)
{
printf("%d\n",(*pb)[i]);
}
system("pause");
}
(3)第三种定义数组指针的方式,企业中最常用
void main()
{
int i=0;
int c[5]={1,2,3,4,5};
int (*parrc)[5]=&c;//在定义数组类型的同时将某块空间的地址赋给它
for(i=10;i<15;i++)
{
(*parrc)[i]=i;
}
for(i=10;i<15;i++)
{
printf("%d\n",(*parrc)[i]);
}
system("pause");
}