C语言,不是很理解typedef,,它是跟宏定义的意思差不多么?那个USER是结构体类型名儿么,

C语言,不是很理解typedef,,它是跟宏定义的意思差不多么?那个USER是结构体类型名儿么,
还一个问题,就是定义了一个结构数组sp[5],getdata函数的形参是指向结构的指针*sp,那它是指向这个结构数组sp[5]么?这样就实现了在子函数里输入数据存到数组里返回给主函数了么?

typedef是给一个类型新的短名字,和define的区别在于它不是纯文字替换,而且要求标识符名字不重复。应当注意typedef的意义更像是变量定义——但是理解为宏定义并不影响实际使用。宏定义是单纯的文字替换(当然是全字检索)。

给的图片中是省略了结构体类型名,USER是这个结构体类型的别名。实际的写法类似这样:

typedef struct User
{
  char name[20];
  char num[10];
} USER;

其中User是结构体类型名,但是实际的使用非常不便,每次需要使用这个结构体都要使用struct User,所以一般都定义一个别名,此处使用USER作为别名。例如定义usr1和usr2两个变量:

struct User usr1;
USER usr2;

可以看到第一种十分不便,所以大多数人都使用第二种。

此处,*sp指针指向的是sp[]数组的第一个元素sp[0]所在的地址,或者说是sp[]数组的地址。但是这不是必然的,而是由getdata(sp);这句话指定的。这句话告诉了getdata函数使用sp数组的地址作为唯一一个参数,类似于汇编中压栈再call getdata

而在getdata中将sp弹出栈,这两个sp的位置是不一样的(&main.sp!=&getdata.sp),但是因为sp的内容是一样的(main.sp==getdata.sp),所以*sp以及sp[]是恒相等的(*main.sp===*getdata.sp&&main.sp[]===getdata.sp[]),故而能够通过改变函数内的sp[]的值来改变主函数的sp[]的值。所以有人说C语言传递数组名字是引用传递。

追问

后边的没接触过,不太理解。。。反正就是主函数定义了一个结构数组,并调用getdata函数,实参是数组名儿(即结构数组sp的首地址),形参定义指针sp,(虽然一个名字,但没啥关联的意义)这个结构指针指向了这个结构数组的首地址,从而达到了在子函数getdata里输入值在传给主函数是么?
还一个问题,就是这个函数怎么就是一个普通的函数啊,看不出来它是返回什么类型的,是形参是指针的缘故么?

或者它怎么不是一个指针型的函数?

追答

你理解的没错,比我室友强多了- -我解释了3遍我室友都没懂。
函数是因为返回类型是被省略了。因为它并不是通过返回值传递数据,而是通过这个数组传回数据所以就省略了。图方便,但是会有点问题:代码可读性差,不应该成为教科书的一部分;不同的编译器的实现不同,比如GCC是弄成int,并且可以修改。总之这个方法各种意义上不推荐,尽管是允许的(实际上1999年的C99标准的时候强制不允许了)。
我感觉这是教科书的话可以弃了。。。找本好一点的,顺便拿一份谭浩强的作为练习(谭浩强的书好像很有名,本身错误一大堆,重点是拿来练习找错误)

如果还有其他问题可以私信我,我很乐意为你解答。

追问

谢谢啦

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-01-31

    typedef跟宏(marco)不一样.
    marco以define实作, 在编译期之前会先做文字替换, 所以其结果应该看成一种replace.
    typedef则不是作为文字替代, 而是"使用者自订型别", 这个自订型别, 也拥有一般型别的编译检查及相关特性.

    getdata(USER *sp) // 此处的sp是一个新的区域变数, 只是与main的sp变量同名, 但不是同一个.

    getdata的(USER *)sp, 是一个名为sp的变量, 该型态是一个指针, 指向一个USER结构的位址(理应为一个实际USER变量). 所以, 透过指针, 写入的位置为实际USER变量内容, 因此返回後仍保持修改有效(上层采用名称指向变量, 下层使用指针指向实际变量, 上下指向同一个)

本回答被网友采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网