一. 数组
- 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
#include
#include
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型变量)。