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

C语言,不是很理解typedef,,它是跟宏定义的意思差不多么?那个USER是结构体类型名儿么,还一个问题,就是定义了一个结构数组sp[5],getdata函数的形参是指... C语言,不是很理解typedef,,它是跟宏定义的意思差不多么?那个USER是结构体类型名儿么,
还一个问题,就是定义了一个结构数组sp[5],getdata函数的形参是指向结构的指针*sp,那它是指向这个结构数组sp[5]么?这样就实现了在子函数里输入数据存到数组里返回给主函数了么?
展开
 我来答
no1xsyzy
2016-01-31 · TA获得超过434个赞
知道小有建树答主
回答量:316
采纳率:100%
帮助的人:212万
展开全部

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里输入值在传给主函数是么?
还一个问题,就是这个函数怎么就是一个普通的函数啊,看不出来它是返回什么类型的,是形参是指针的缘故么?
或者它怎么不是一个指针型的函数?
johnwanz
2016-01-31 · TA获得超过781个赞
知道小有建树答主
回答量:716
采纳率:80%
帮助的人:228万
展开全部
  1. typedef跟宏(marco)不一样.
    marco以define实作, 在编译期之前会先做文字替换, 所以其结果应该看成一种replace.
    typedef则不是作为文字替代, 而是"使用者自订型别", 这个自订型别, 也拥有一般型别的编译检查及相关特性.

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

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

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式