简洁的解释一下这个问题吧

chin_chen 2009-02-06 08:03:43
#include <cstdio>
#include <iostream>
using namespace std;

int main()
{
char *s[]={"man","woman","girl","boy","sister"};
char **q;
int k;

for(k=0;k <5;k++)
{
*q=s[k];
printf("%s\n",*q);
}
system("pause");
return 0;
}

在dev-c++中编译,运行都能通过,而在vc2005中运行出错了啊。
...全文
186 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hityct1 2009-02-09
  • 打赏
  • 举报
回复
改成如下:

#include <cstdio>
#include <iostream>
using namespace std;

int main()
{
char *s[]={"man","woman","girl","boy","sister"};
char **q;
int k;

for(k=0;k <5;k++)
{
q=&s[k]; //这
printf("%s\n",*q);
}

return 0;
}

taodm 2009-02-09
  • 打赏
  • 举报
回复
楼主还是找本《C与指针》认真研读,一劳永逸地解决这类问题吧。
muguayike 2009-02-09
  • 打赏
  • 举报
回复
for(k=0;k <5;k++)
{
q=new char*;
*q=s[k];
printf("%s\n",*q);
delete q;
}
system("pause");
return 0;
zhh157 2009-02-08
  • 打赏
  • 举报
回复
对于**q者
当看到两个*,不要以为编译器就会为你分配两级指针的内存

char **q; //编译器只会为q分配内存,但q具体指向哪还未确定。
//即q是指向char**的一个指针,因此你可以用p去进行操作
//但是,*p却并未定义,内存结构类似于下:
// | q |->| *q |->| "abc" |
// 因此,如果你要操作*q,就要首先给*q分配内存,也即初始化
// 记住,只有初始化后的内存才可以进行操作,初始化可以new,也可以赋值

deerwin1986 2009-02-08
  • 打赏
  • 举报
回复
首先 多级指针使用中注意: 每级指针在解引用之前都要保证指针不为NULL 而且 有效...
其次 10L的代码可以通过编译 道理上也通
不知道这样有什么不妥 为什么非要NEW个指针出来
请阿荣哥指教...
arong1234 2009-02-07
  • 打赏
  • 举报
回复
一定要二级指针,方法应该这样


#include <stdio.h>

int main()
{
char *s[]={"man","woman","girl","boy","sister"};
char **q;
int k;
q=new char*; //这才是赋值一级指针得正确方法,我们不需要分配5个单元,也不能把现有得某个单元给它,因为没有空余得一级指针可以被你借用
for(k=0;k <5;k++)
{
*q=s[k]; //再赋二级指针;
printf("%s\n",*q);
}
return 0;
}


arong1234 2009-02-07
  • 打赏
  • 举报
回复
q没初始化就勇*q是非法得,楼主实际上不需要二级指针,下面代码即可


#include <stdio.h>

int main()
{
char *s[]={"man","woman","girl","boy","sister"};
char *q;
int k;

for(k=0;k <5;k++)
{
q=s[k];
printf("%s\n",q);
}
return 0;
}




至于10楼,那也是没有弄明白指针,先赋一级指针那行能通过编译?那是一级指针么?
Big鹏 2009-02-07
  • 打赏
  • 举报
回复

#include <stdio.h>

int main()
{
char *s[]={"man","woman","girl","boy","sister"};
char **q;
int k;
q=&s[0]; //先赋一级指针;
for(k=0;k <5;k++)
{
*q=s[k]; //再赋二级指针;
printf("%s\n",*q);
}
return 0;
}
yutaooo 2009-02-06
  • 打赏
  • 举报
回复

真好!
feng4206yu 2009-02-06
  • 打赏
  • 举报
回复
估计当编译器看到*p的时候会先寻找p的相关信息(地址和数据等等),*p会根据p的内容来确定...虽然当声明char **p的的时候p作为一个自动变量而生成,我的理解是占有一个内存块,但如果这个内存块此时并没有被初始化,那么*p就被认为是不可能取得的...但是我觉得这还不是这个问题的根本,p作为一个指向一个字符指针的指针,*p的内存块并没有具现...我们的目的是让p指向s数组,所以p = &s[k]是完全OK的,但是通过*p来间接让p来得到值才是这个程序最大的特点,但是*p在这个程序中是不存在的(数组),即使p是一个指针的指针...
tangshuiling 2009-02-06
  • 打赏
  • 举报
回复


char **q=s; //q的地址是s的首地址啦,当然会没有问题,不管是分配的还是赋值操作,起码保证操作*q时q有对应的内存值就对了

chin_chen 2009-02-06
  • 打赏
  • 举报
回复
请问必须要分配内存空间么??下面怎么就可以了。
#include  <cstdio>
#include <iostream>
using namespace std;

int main()
{
char *s[]={"man","woman","girl","boy","sister"};
char **q=s;
int k;

for(k=0;k <5;k++)
{
*q=s[k]; //OK, *q=s[k]; not ok,为什么

printf("%s\n",*q);
}
system("pause");
return 0;
}

请问必须要分配内存空间么??
hastings 2009-02-06
  • 打赏
  • 举报
回复
*q=s[k];
相当于q[0]=s[k];
显然,还没分配内存就使用是错误的。。

相当于:
int *p;
*p=0;
chin_chen 2009-02-06
  • 打赏
  • 举报
回复
char **q=new char*[5];
那你的意思是, 这个是初始化一级指针咯。
tangshuiling 2009-02-06
  • 打赏
  • 举报
回复

不是已经告诉你了嘛!
char **q;
*q=s[k]; //请问此时q的地址事多少?(明显没有初始化,q的地址不知道又如何找到*q,q和*q是有连带关系的)
把代码改成如下:
#include <cstdio>
#include <iostream>
using namespace std;

int main()
{
char *s[]={"man","woman","girl","boy","sister"};
char **q=new char*[5]; //为变量q分配空间
int k;

for(k=0;k <5;k++)
{
*q=s[k];
printf("%s\n",*q);
}
system("pause");
return 0;
}

waizqfor 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 chin_chen 的帖子:]
C/C++ code#include <cstdio>
#include <iostream>
using namespace std;

int main()
{
char *s[]={"man","woman","girl","boy","sister"};
char **q;
int k;

for(k=0;k <5;k++)
{
*q=s[k];
printf("%s\n",*q);
}
system("pause");
return 0;
}
在dev-c++中编译,运行都能通过,而在vc2005中运行出错了啊。
[/Quote]
在我机器上DEV-C++ 内存写入错误呢 你那个还能运行 挺奇怪
不过必然的错误就是在用2J指针的时候 1J指针必须要初始化 要不就会报错
sagegz 2009-02-06
  • 打赏
  • 举报
回复
的确如此,VS2005下此程序运行通不过,因为在使用2级指针前,1级指针必须先经过初始化.
所以出错是必然的.
没有DEV,所以不太清楚.估计跟编译器有关吧.

64,687

社区成员

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

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