栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c/c++语言自定义和默认数组函数传参方式以及遇到的问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c/c++语言自定义和默认数组函数传参方式以及遇到的问题

默认数组利用函数调用的方式(3种,都是传址,局部函数内改变数组main函数的数组也会相应改变)
  1. 数组普通传值 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);
  1. 数组引用传值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);
  1. 数组指针传值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");
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/993639.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号