免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: uid500
打印 上一主题 下一主题

二维字符串数组和指针数组的迷惑??传递问题! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-12-19 10:17 |只看该作者
高手啊 ,我也懂了 ,谢谢了啊

论坛徽章:
0
12 [报告]
发表于 2006-12-19 11:02 |只看该作者
楼主程序中的 str 数组是一个 一维数组。此数组是一个指针类型的数组,即数组的每一个元素都是一个地址值(char* 型指针),这些地址分别来自于用来初始化数组的各个字符串(本身是一个字符数组)的第一个字符所在的位置(数组转换为指针使用)。

可能写成下面等价的形式就更容易明白了:
  1.   char* s1 = "this is the test1";
  2.   char* s2 = "this is the test2";
  3.   char* s3 = "this is the test3";
  4.   char* str[] = { s1, s2, s3 };
复制代码


To MackedNice

>> 数组名是一个常量,一个地址值。该地址就是内存中数组的首地址。

楼主程序中的数组是一个非静态数组,所以不是常量。如果不清楚为什么,参考这个帖子:http://bbs.chinaunix.net/viewthread.php?tid=830359

数组名代表的地址是 数组第一个元素的地址,而不是 数组的首地址。数组的地址和数组第一个元素的地址虽然在数值上相同,但是在类型上不同,所以不能进行相等比较。记住:C 语言中所说的地址是指针类型,除了大小概念外,还有类型上的约束。

[ 本帖最后由 whyglinux 于 2006-12-19 11:10 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2006-12-19 11:32 |只看该作者
原帖由 whyglinux 于 2006-12-19 11:02 发表
楼主程序中的 str 数组是一个 一维数组。此数组是一个指针类型的数组,即数组的每一个元素都是一个地址值(char* 型指针),这些地址分别来自于用来初始化数组的各个字符串(本身是一个字符数 ...


  1.   char* s1 = "this is the test1";
  2.   char* s2 = "this is the test2";
  3.   char* s3 = "this is the test3";
  4.   char* str[] = { s1, s2, s3 };
复制代码


这样改是不对的,楼主的数组不是常量,修改后str中的元素全部是常量了,这样做会逃避编译器的语法检查,造成潜在的错误。例如
str[0][1] = 'a';
编译时不会报错,但运行会发生段错误,原因在于试图修改只读的内存。


收回上面的话,刚才没仔细看楼主程序,只看到whyglinux说“楼主程序中的数组是一个非静态数组,所以不是常量”。这样改没有错,楼主的数组中的指针指向的也是常量哈。不过不删除这个帖子,因为里面提到一个常见的错误。

[ 本帖最后由 zx_wing 于 2006-12-19 11:38 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2006-12-19 11:59 |只看该作者
原帖由 zx_wing 于 2006-12-19 09:09 发表


理解二维数组,最好自己在纸上画一画数组在内存中是怎么排列的,然后想想不同类型的指针加1会移动几个字节。就容易搞清楚了。

现在想通了!就是一个放有指针的数组,他的类型是char *,不知道可不可以这样理解~!然后要传这个指针数组,那当然要int myprint(char *str[],int len);
或int myprint(char **str,int len);声明了!这两个声明应该是一样的吧?呵呵!谢谢各位了!
whyglinux
版主-天使
说的,我得好好学学!

论坛徽章:
0
15 [报告]
发表于 2006-12-19 12:18 |只看该作者
原帖由 uid500 于 2006-12-19 11:59 发表

现在想通了!就是一个放有指针的数组,他的类型是char *,不知道可不可以这样理解~!然后要传这个指针数组,那当然要int myprint(char *str[],int len);
或int myprint(char **str,int len);声明了!这两个声明应该是 ...


其实是不一样的,不过还是由whyglinux引用标准给你解释一下,我的表述会不严谨,怕给你造成误解。

论坛徽章:
0
16 [报告]
发表于 2006-12-19 12:23 |只看该作者
呵呵!那有什么这方面的书,我好好看看!谢谢了!

论坛徽章:
0
17 [报告]
发表于 2006-12-19 12:50 |只看该作者
>> 要传这个指针数组,那当然要int myprint(char *str[],int len);或int myprint(char **str,int len);声明了!这两个声明应该是一样的吧?

是的,这两种函数声明完全一样。在函数参数中声明的数组类型的参数,都是转换为指针来使用的,其实际的类型是指针。可以认为前者只是后者的另外一种书写形式。比如,下面的各种的关于 main 函数声明是等价的(其中后面两种是最为常用的形式):
  1. int main( int argc, char* argv[10] )  // 在这里的 10 这个数组长度的信息是多余的,因为 argv 的真正类型是指针,不是数组。
  2. int main( int argc, char* argv[] )
  3. int main( int argc, char** argv )
复制代码

论坛徽章:
0
18 [报告]
发表于 2006-12-19 13:06 |只看该作者
哦!呵呵,了解了!多谢了!~

论坛徽章:
0
19 [报告]
发表于 2006-12-19 13:07 |只看该作者
原帖由 whyglinux 于 2006-12-19 12:50 发表
>> 要传这个指针数组,那当然要int myprint(char *str[],int len);或int myprint(char **str,int len);声明了!这两个声明应该是一样的吧?

是的,这两种函数声明完全一样。在函数参数中声明的数组类型的参 ...



是行为上一样还是本质上一样?

论坛徽章:
0
20 [报告]
发表于 2006-12-19 13:08 |只看该作者
是的啊!到底是那方面是一样的?呵呵!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP