数组类型——typedef定义的数组类型的函数调用

本文探讨了如何使用C语言中的typedef定义数组类型,并通过具体示例解释了指向数组的指针的概念及其应用。文中详细介绍了如何利用typedef简化数组类型的声明,并展示了如何正确地在函数间传递数组类型的指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Typedef 定义数组类型:代码如下(vs2013)(不能实现数组传递)

【v1.0

typedef unsigned char ElemType[6];

int Return(ElemType **p){

ElemType a = { 'q', 'm', 'e', 'u', 'p', 'y' };

*p = &a;

return 1;

}

main(){

ElemType *e;

Return(&e);

}

用Typedef 定义的数组类型来定义指针

ElemType *p;等价于typedef unsigned char (*p)[6];

参考谭浩强的书上指向数组的指针的知识。“p”为指向数组的指针,可以理解为二维数组。”p+1”为指向下一行,但是不取该行。“*p”便是对二维数组取行的操作,是行的首地址。“*p+1”是在行的基础上偏移一列,是元素的地址。“**p”先取该行地址,再取首地址的元素,输出为0号元素。“*(*p+i)”取该行第i号元素。

    在Return()函数中,形参定义为ElemType *p时,对指针赋值时为 “p=a;” 如果用 ”*p=a;” 是无法办到的。因为 ”*p”是一维数组,也是首地址,就像 “a” 一样(数组变量名不能赋值),所以会报错“*p”不能作为左值(当然这里可以调用函数memcpy()来代替赋值语句)。对于“p=a;” 该语句是不能将数组“a” 一次性传出去的。因为改变的是子函数的形参。

 

 

【v2.0

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef unsigned char ElemType[6];

int Return(ElemType **p){

    static ElemType a = { 'q', 'm', 'e', 'u', 'p' };

    *p = &a;

    return 1;

}

main(){

    ElemType **e;

    e = (ElemType **)malloc(sizeof(ElemType));

    Return(e);

    int i = 0;

    for (; i < 6; ++i){

        printf("e+%d:      %x\n", i, e + i);

        printf("*e+%d:     %x\n", i, *e + i);

        printf("**e+%d:    %x\n", i, (**e) + i);

        printf("*(**e+%d):%c\n",i,*((**e) + i));

        printf("\n");

    }

}

    1.0版本看似没错,但得不到想要的输出(如果没有关键字 static)。把2.0版本中的for()拷贝到1.0版本中,你就会发现输出的根本不是想要是数据。“a” 在定义的时候定义的地址能够传给指针“e”,但是 “a”地址里面的内容完全无法保证,因为当子函数结束时,对应的内存会释放作他用。

    第二点是for()中的第一个printf()。“*e+i”是跳行,地址每次加”i*sizeof(ElemType)”。按理来说 ”e+i“表示地址按页的大小来增加,但是输出结果显示每次加“i*4”. 也就是说地址是按“i” 的变量类型来加的(4个字节表示一个int型变量)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值