- 数组普通传值 a—>a[]或a[10]
void InsertIntoList1(char a[]){ //插入方式1
for(int i=0;i<10;i++){
a[i] = i+'a';
}
}
void PrintA1(const char a[]){
printf("Print3: ");
for(int i=0;i<10;i++){
printf("%c ",a[i]);
}
printf("n");
}
=============================
//调用函数
InsertIntoList1(a);
PrintA1(a);
- 数组引用传值a—>(&a)[10] 必须限定a的大小,不写大小无法分辨是变量还是数组
void InsertIntoList2(char (&a)[10]){ //插入方式2 必须限定大小为10
for(int i=0;i<10;i++){
a[i] = i+'b';
}
}
void PrintA2(char (&a)[10]){ //打印数组
printf("Print1: ");
for(int i=0;i<10;i++){
printf("%c ",a[i]);
}
printf("n");
}
========================
//调用函数
InsertIntoList2(a);
PrintA2(a);
- 数组指针传值a—>*a
void InsertIntoList3(char *a){ //插入方式3
for(int i=0;i<10;i++){
*(a+i) = i+'c';
}
}
void PrintA3(char *a){
printf("Print2: ");
for(int i=0;i<10;i++){
printf("%c ",*(a+i));
}
printf("n");
}
========================
//调用函数
InsertIntoList3(a);
PrintA3(a);
三种方式输出如下:
自定义数组类型利用函数调用方式(这里用静态链表演示) 第一种定义方式,结构体名为List,这种方式和默认数组调用一样有三种方式:
typedef struct //第一种方式定义
{
ElemType data; //存放数据
int next; //下一个元素数组下标
}List;
注:数组下标为0的位置不存数据,从下标1开始存储。
采用List a[],List (&a)[MaxSize],List *a初始化自定义输入如下:
bool InitLinkList1(List a[]){ //第1种定义方式1普通传值
a[0].data = -1; //数组下标为0
a[0].next = 2;
a[2].data = 111; //数组下标为2
a[2].next = 5;
a[5].data = 111; //数组下标为5
a[5].next = 1;
a[1].data = 111; //数组下标为1
a[1].next = -2; //结束
return true;
}
bool InitLinkList2(List (&a)[MaxSize]){ //第1种定义方式2引用
a[0].data = -1; //数组下标为0
a[0].next = 2;
a[2].data = 222; //数组下标为2
a[2].next = 5;
a[5].data = 222; //数组下标为5
a[5].next = 1;
a[1].data = 2222; //数组下标为1
a[1].next = -2; //结束
return true;
}
bool InitLinkList3(List *a){ //第1种定义方式3指针
a[0].data = -1; //数组下标为0
a[0].next = 2;
a[2].data = 333; //数组下标为2
a[2].next = 5;
a[5].data = 333; //数组下标为5
a[5].next = 1;
a[1].data = 333; //数组下标为1
a[1].next = -2; //结束
return true;
}
第二种定义方式,结构体名为SLinkList,直接给定数组大小,这里MaxSize为10:
typedef struct //第2种方式定义
{
ElemType data; //存放数据
int next; //下一个元素数组下标
}SLinkList[MaxSize];
采用引用方式定义如下:
bool InitSLinkList(SLinkList &a){
a->data = -1; //数组下标为0
a->next = 2;
(a+2)->data = 3; //数组下标为2
(a+2)->next = 5;
(a+5)->data = 23; //数组下标为5
(a+5)->next = 1;
(a+1)->data = 55; //数组下标为1
(a+1)->next = -2; //结束
return true;
}
采用普通传值方式定义如下:
bool InitSLinkList2(SLinkList a){
a->data = -1; //数组下标为0
a->next = 2;
(a+2)->data = 2222; //数组下标为2
(a+2)->next = 5;
(a+5)->data = 2222; //数组下标为5
(a+5)->next = 1;
(a+1)->data = 2222; //数组下标为1
(a+1)->next = -2; //结束
return true;
}
为什么这里直接是SLinkList a,而不是a[]呢,我的理解是SLinkList里本就定义了[],所以就相当于是默认数组的普通传值方式。
那么这个InitSLinkList2的调用怎么调用呢?
SLinkList b; //第2种方式定义
if(InitSLinkList2(b)) printf("初始化静态链表b成功n");
问:这里的SLinkList不是包含了数组大小吗,那么变量b是什么含义呢?
答:变量b是地址,所以InitSLinkList2是地址在传,形参和实参的地址是一样的。
给char类型数组赋值后利用%c或者%s无法输出?可能是数组赋值过程中隐性转换为其他类型了,例如:
char a[10];
for(int i=0;i<10;i++){
//a[i] = i; //转换为int
a[i]=i+'0';//转换为char
//a[i] = (char)(i+100);//也可以这样写,这样是转换为对应assic码表的字母
//a[i] = (char)(i); //这样写会无法输出,因为对应assic码表没内容
}
遗留问题:第二种自定义数组有没有利用指针*来传递参数的呢?
额 这个我没写出来,我也想知道。
附:改自定义数组的打印函数如下,可直接调用。
void PrintSLinkList(SLinkList a){
int point = a[0].next;
do
{
printf("%d ",a[point].data);
point = a[point].next;
}while (a[point].next!=-2); //下一个指向下标为-2则表示为最后一个
printf("%d ",a[point].data);
printf("n");
}



