LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: shangxd

还是指针的指针的问题!

[复制链接]
发表于 2003-7-10 00:28:50 | 显示全部楼层
char *a[30];
a是一个数组,数组的项是char *,也就是说a保存了30个地址,
a的类型是char *[30],相当于char **,
a[0]的类型是char *,
*a[0]的类型是char,
所以用*a[0] = “hello”是错误的,这相当于char = char *,类型不对,
char *w = “hello”;
a[0] = w;
可以通过就不难理解了。
发表于 2003-7-11 18:41:54 | 显示全部楼层
最初由 freshman01 发表
arg[0]不能附值

*arg[0]才能

*arg[0]=**P;

arg[0]当然能付值,但要付(char *)

下面的用法是有问题的
char ** p //这里定义了p但并未初始化
*p = ...  //*p是一个不确定的单元,对其付值可能造成不可知的后果,这种
语句我认为还是少用为好
发表于 2003-7-11 18:44:30 | 显示全部楼层
最初由 freshman01 发表
arg[0]不能附值

*arg[0]才能

*arg[0]=**P;

arg[0]当然能付值,但要付(char *)

下面的用法是有问题的
char ** p //这里定义了p但并未初始化
*p = ...  //*p是一个不确定的单元,对其付值可能造成不可知的后果
发表于 2003-7-11 20:04:02 | 显示全部楼层
libinary兄讲的很明白。a里面既可以放地址,也可以放数据
a代表的是首地址,从这个意义上说,指针和数组名是一样的。
当然可以互相赋值了。
发表于 2003-7-11 20:50:07 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void input(char *str[]);
  4. int main()
  5. {
  6.         char s[2][100];
  7.         input(s);
  8.         printf("s0: %s\t",s[0]);
  9.         printf("s1: %s\n",s[1]);
  10.         return;
  11. }
  12. void input(char *str[])
  13. {
  14.         int i=0,j=0;
  15.         while(1)
  16.         {
  17.                 if((str[i][j]=getchar())=='\n')
  18.                 {
  19.                         str[i][j]='\0';
  20.                         i++;
  21.                         if(i==2)
  22.                                 return;
  23.                         j=0;
  24.                         continue;
  25.                 }
  26.                 j++;
  27.         }
  28. }
复制代码

编译提示:
warning: passing arg 1 of 'input' from incompatible pointer type
运行提示:段错误

不知为什么?
发表于 2003-7-11 21:02:52 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void input(char *str[]);
  4. int main()
  5. {
  6.         char *s[2];
  7.         s[0]=(char *)malloc(100);
  8.         s[1]=(char *)malloc(100);
  9.         input(s);
  10.         printf("s1: %s\t",s[0]);
  11.         printf("s2: %s\n",s[1]);
  12.         free(s[0]);
  13.         free(s[1]);
  14.         return;
  15. }
  16. void input(char *str[])
  17. {
  18.         int i=0,j=0;
  19.         while(1)
  20.         {
  21.                 if((str[i][j]=getchar())=='\n')
  22.                 {
  23.                         str[i][j]='\0';
  24.                         i++;
  25.                         if(i==2)
  26.                                 return;
  27.                         j=0;
  28.                         continue;
  29.                 }
  30.                 j++;
  31.         }
  32. }
复制代码

这样又运行的很好?
发表于 2003-7-11 21:05:59 | 显示全部楼层
以上都没有考虑j>=100的溢出
发表于 2003-7-11 21:15:41 | 显示全部楼层
你的那个return怎么没有参数阿?
发表于 2003-7-11 21:38:47 | 显示全部楼层
在C语言中是没有什么N维数组的,实际上只有一维数组。改成这样就可以正常运行了,但编译时会出现一些警告。

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void input(char *str[]);

  4. int main()
  5. {
  6.         char a[2][100];
  7.         char *s[]={&a[0],&a[1]};
  8.         input(s);
  9.         printf("s0: %s\t",s[0]);
  10.         printf("s1: %s\n",s[1]);
  11.         return;
  12. }

  13. void input(char *str[])
  14. {
  15.         int i=0,j=0;
  16.         while(1)
  17.         {
  18.                 if((str[i][j]=getchar())=='\n')
  19.                 {
  20.                         str[i][j]='\0';
  21.                         i++;
  22.                         if(i==2)
  23.                                 return;
  24.                         j=0;
  25.                         continue;
  26.                 }
  27.                 j++;
  28.         }
  29. }
复制代码
发表于 2003-7-11 22:02:45 | 显示全部楼层
最初由 kj501 发表
在C语言中是没有什么N维数组的,实际上只有一维数组。


这个是关键,现在知道为什么会“passing arg 1 of 'input' from incompatible pointer type”。谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表