你好,还想请教你点问题。
在我提问之前用int跟struct类型尝试,自定义函数中动态内存分配内存过程中,与函数间地址传递的练习中,发现一些问题不太明白,在用int传递指针,在自定义函数中用二级指...
在我提问之前用int跟struct类型尝试,自定义函数中动态内存分配内存过程中,与函数间地址传递的练习中,发现一些问题不太明白,在用int传递指针,在自定义函数中用二级指针的形参接收地址,在函数内可以用**pp = 450;成功赋值,并可以返回到主函数中打印。在用struct 传递指针到自定义函数中,用二级指针形参接收,在函数内(*pp)->num = 500;成功赋值并打印。但是,为什么在int中用(*p)=450 却出错,在struct 中以**pp->num = 500;也出错。指针到是明白地址与地址间改变地址内的值的原理,可到二级指针赋值的时候让人摸不着头脑。
展开
1个回答
展开全部
类型问题。
第一个。 pp是int **型, *pp就是int*型,这是一个指针, 是不允许直接赋值常量的。 如果要赋值,可以 *pp=(int *)50. 不过这个是危险的, 因为等效于在主函数中 p=(int*)50. 很明显, 50不是一个合法地址, 这样赋值后, 一旦后续有printf("%d\n",*p);这样的取值操作,就会因为非法地址访问导致程序崩溃。
第二个类似。 pp是二级指针 而->的优先级高于*
这样 写成 **p->num其实是**(p->num)而作为二级指针的p, 是没有num这个元素的。 所以会提示num找不到。 要用这种形式访问, 可以写成
(**p).num
注意是点, 因为**p已经不是指针而是结构体类型了。
第一个。 pp是int **型, *pp就是int*型,这是一个指针, 是不允许直接赋值常量的。 如果要赋值,可以 *pp=(int *)50. 不过这个是危险的, 因为等效于在主函数中 p=(int*)50. 很明显, 50不是一个合法地址, 这样赋值后, 一旦后续有printf("%d\n",*p);这样的取值操作,就会因为非法地址访问导致程序崩溃。
第二个类似。 pp是二级指针 而->的优先级高于*
这样 写成 **p->num其实是**(p->num)而作为二级指针的p, 是没有num这个元素的。 所以会提示num找不到。 要用这种形式访问, 可以写成
(**p).num
注意是点, 因为**p已经不是指针而是结构体类型了。
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询