发布网友 发布时间:2023-05-18 08:25
共2个回答
热心网友 时间:2023-10-20 08:35
typedef是给一个类型新的短名字,和define的区别在于它不是纯文字替换,而且要求标识符名字不重复。应当注意typedef的意义更像是变量定义——但是理解为宏定义并不影响实际使用。宏定义是单纯的文字替换(当然是全字检索)。
给的图片中是省略了结构体类型名,USER是这个结构体类型的别名。实际的写法类似这样:
typedef struct User其中User是结构体类型名,但是实际的使用非常不便,每次需要使用这个结构体都要使用struct User,所以一般都定义一个别名,此处使用USER作为别名。例如定义usr1和usr2两个变量:
struct User usr1;可以看到第一种十分不便,所以大多数人都使用第二种。
此处,*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语言传递数组名字是引用传递。
热心网友 时间:2023-10-20 08:36
typedef跟宏(marco)不一样.
marco以define实作, 在编译期之前会先做文字替换, 所以其结果应该看成一种replace.
typedef则不是作为文字替代, 而是"使用者自订型别", 这个自订型别, 也拥有一般型别的编译检查及相关特性.
getdata(USER *sp) // 此处的sp是一个新的区域变数, 只是与main的sp变量同名, 但不是同一个.
getdata的(USER *)sp, 是一个名为sp的变量, 该型态是一个指针, 指向一个USER结构的位址(理应为一个实际USER变量). 所以, 透过指针, 写入的位置为实际USER变量内容, 因此返回後仍保持修改有效(上层采用名称指向变量, 下层使用指针指向实际变量, 上下指向同一个)