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里输入值在传给主函数是么?
还一个问题,就是这个函数怎么就是一个普通的函数啊,看不出来它是返回什么类型的,是形参是指针的缘故么?
或者它怎么不是一个指针型的函数?
typedef跟宏(marco)不一样.
marco以define实作, 在编译期之前会先做文字替换, 所以其结果应该看成一种replace.
typedef则不是作为文字替代, 而是"使用者自订型别", 这个自订型别, 也拥有一般型别的编译检查及相关特性.getdata(USER *sp) // 此处的sp是一个新的区域变数, 只是与main的sp变量同名, 但不是同一个.
getdata的(USER *)sp, 是一个名为sp的变量, 该型态是一个指针, 指向一个USER结构的位址(理应为一个实际USER变量). 所以, 透过指针, 写入的位置为实际USER变量内容, 因此返回後仍保持修改有效(上层采用名称指向变量, 下层使用指针指向实际变量, 上下指向同一个)