指针引用时*和*&的区别,具体例子看下面

烧技湾 2014-07-30 04:49:29
A段——建立空顺序表时没有bug的代码:
typedef struct sqlist
{
elem_type *Arry;
int Arrylength;
} Sqlist;
//建立一个空表
Statue Create_Sqlist(Sqlist *&S)
{
S = (Sqlist *)malloc(sizeof(Sqlist));
S->Arry = (elem_type *)malloc(MaxSize);
}

B段——建立空顺序表出现bug的代码:
#define MaxSize 100
typedef struct sqlist
{
elem_type Arry[MaxSize];
int Arrylength;
} Sqlist;
//建立一个空表
Statue Create_Sqlist(Sqlist *S)
{
S->Arry = (elem_type *) malloc(MaxSize*sizeof(elem_type)); }
...全文
152 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-08-01
  • 打赏
  • 举报
回复
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
烧技湾 2014-07-30
  • 打赏
  • 举报
回复
@zhangxiangDavaid 大牛,讲得很透彻! 但是A中的 Statue Create_Sqlist(Sqlist *&S) //S既是指针类型,也是实参的引用 { S = (Sqlist *)malloc(sizeof(Sqlist)); //让S指向了一个无名的Sqlist类型的对象 S->Arry = (elem_type *)malloc(MaxSize); //S->Arry是指针,也让它指向一个无名的数组,这就是分配空间 } 为嘛都是无名的Sqlite和数组呢?明明给出了数组名Arry。
烧技湾 2014-07-30
  • 打赏
  • 举报
回复
找不到怎么针对不同楼分别回复呢? 只能@lovesmiles :这种定义为何不行?在struct里面可以包含数组啊。
苏叔叔 2014-07-30
  • 打赏
  • 举报
回复
这个问题很简单。 在A段中, Statue Create_Sqlist(Sqlist *&S) //S既是指针类型,也是实参的引用 { S = (Sqlist *)malloc(sizeof(Sqlist)); //让S指向了一个无名的Sqlist类型的对象 S->Arry = (elem_type *)malloc(MaxSize); //S->Arry是指针,也让它指向一个无名的数组,这就是分配空间 } 在B段中, elem_type Arry[MaxSize]; //这是数组的形式,不是指针。一旦创建一个Sqlist类型,就已经为Arry分配了内存。 只需 Statue Create_Sqlist(Sqlist *&S) { S = (Sqlist *)malloc(sizeof(Sqlist)); }
勤奋的小游侠 2014-07-30
  • 打赏
  • 举报
回复
typedef struct sqlist    {     elem_type  Arry[MaxSize];     int  Arrylength;     } Sqlist; 你这种定义已经有问题 Arry是数组名,是一个右值,不可以赋值给它的。
water-moon 2014-07-30
  • 打赏
  • 举报
回复
要用第二种这样写:

  Statue Create_Sqlist(Sqlist **S)
{
    *S = (Sqlist *)malloc(sizeof(Sqlist)); 
    (*S)->Arry = (elem_type *) malloc(MaxSize*sizeof(elem_type));  
}
//调用也要改
void test()//这里写调用代码
{
    Sqlist * p;
    Create_Sqlist2(&p);  
} 
water-moon 2014-07-30
  • 打赏
  • 举报
回复
S = (Sqlist *)malloc(sizeof(Sqlist)); 出错的原因是第二种没有了这一句,但是第二种和第一种已经完全不一样了。

 Statue Create_Sqlist1(Sqlist *&S);//这里s相当于实参的别名,没有重新定义变量
 Statue Create_Sqlist2(Sqlist *S);  //这里重新定义了指针s,对于s的所有操作都是局部的
void test()//这里写调用代码
{
    Sqlist * p;
    Create_Sqlist1(p);  //这里p是分配了空间
    Create_Sqlist2(p);  //这里p没有分配空间
}
JasonCharlesBourne 2014-07-30
  • 打赏
  • 举报
回复
第一重里面调用了两次malloc的原因: 第一次申请的大小是Sqlist的大小包括一个elem_type *Arr指针大小加上一个int类型的大小 第二次申请的是elem_type *Arry指向的内存
JasonCharlesBourne 2014-07-30
  • 打赏
  • 举报
回复
用指针的指针,你这样申请到的内存不是真正调用此函数需要的,而是申请给了参数。
烧技湾 2014-07-30
  • 打赏
  • 举报
回复
能给出具体的代码吗?
我看你有戏 2014-07-30
  • 打赏
  • 举报
回复
第二种只要 malloc Sqlist 这一个结构就可以了啊 何必还要这么麻烦呢
烧技湾 2014-07-30
  • 打赏
  • 举报
回复
求大神帮忙:为什么第二中代码段错误,而第一重里面调用了两次malloc又是什么原因(malloc后面的参数难道没有影响吗)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧