免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2485 | 回复: 15
打印 上一主题 下一主题

指教字符串问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-26 13:15 |只看该作者 |倒序浏览
最近在看书的时候发现了一些不懂的地方:
  在字符串复制函数时有
              strcpy(字符数组1,字符串2)
说明中有:字符数组1必须是数组名,字符串可以 是数组名,也可以是字符串常量.
这两个名词包含的范围有什么不一样吗?

论坛徽章:
0
2 [报告]
发表于 2006-03-26 14:06 |只看该作者

回复 1楼 爱随柳飘 的帖子

strcpy2个参数声明都是指针类型,就是从一个地址拷贝直到\0为止的字符到令一个地址,数组名本身就是一个地址的开始,字符串本身也是一个地址的开始,注意c里里面没有字符串这个类型,他说的字符串是一个指针。指针和数组名是不一样的。不知道这么说清楚否!

论坛徽章:
0
3 [报告]
发表于 2006-03-26 14:26 |只看该作者
原帖由 frankytf 于 2006-3-26 14:06 发表
strcpy2个参数声明都是指针类型,就是从一个地址拷贝直到\0为止的字符到令一个地址,数组名本身就是一个地址的开始,字符串本身也是一个地址的开始,注意c里里面没有字符串这个类型,他说的字符串是一个指针。指针 ...

能明白C中没有字符串这个类型,数组名本身也是一个地址的开始,也就是它代表的是数组首元素的地址.

但"字符串本身也是一个地址的开始"是这样的吗?没有看到过这样的表述.哪能看到呢?
还有,这里的字符串,就是我指的字符串常量吗?如果是,那么是不是常量就是一个地址的开始呢?

论坛徽章:
0
4 [报告]
发表于 2006-03-26 17:22 |只看该作者
这里的字符串 不是字符串常量,
实际上这里的字符串 包含两重意思:
1.字符串常量 2.字符数组
实际上字符串常量也是存在内存的某个地方的 只是你不能直接知道它的地址,编译系统自动分配并访问
字符串常量不光地址不能改(系统分配后),内容也不能改.

字符数组是有名字的 名字就是访问地址的通道 也就代表了它的地址
字符数组只是地址不能改 内容是可以改的.

你说的常量是否代表一个地址的开始???  从本质上说应该是,从使用上说也可以说不是,这点有点类似引用
因为你不能直接知道它的地址,你访问它是通过编译系统自动进行的

你问这个问题 就好比问 变量是否代表一个地址的开始一样? 本质上是,使用上又不是.
因为我们所关心的是 字符串常量的值 而不是它存在什么地方(即地址)

有时候不要玩文字游戏,理解本质就好了
不知道我这样解释是否清楚
:wink:

[ 本帖最后由 usbboy 于 2006-3-26 17:38 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2006-03-26 18:59 |只看该作者
原帖由 usbboy 于 2006-3-26 17:22 发表
这里的字符串 不是字符串常量,
实际上这里的字符串 包含两重意思:
1.字符串常量 2.字符数组
实际上字符串常量也是存在内存的某个地方的 只是你不能直接知道它的地址,编译系统自动分配并访问
字符串常量不光地 ...

哦,我好好品尝一下.

论坛徽章:
0
6 [报告]
发表于 2006-03-26 20:46 |只看该作者
在 the_c_programming_language 中把指针和数组安排则一个章节描述的,可见指针和数组关系有多么“亲密”,比如sArray[i]编译器就是把其转换成*(sArray+i)的;
再比如:C语言中能实现动态数组吗?使用指针就可以实现:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
    int  iArrayElement=20;
    int iLoop;
    int *p=NULL;

    p=(int*) malloc(iArrayElement*sizeof(int));
    if(NULL == p)
    {
        printf("Malloc error!\n");
         return -1;
    }
    for(iLoop=0;iLoop<iArrayElement;iLoop++)
    {
        p[iLoop] = iLoop;
    }

    for(iLoop=0;iLoop<iArrayElement;iLoop++)
    {
        printf("Dynamic  Array[%d] is :%d\n",iLoop,p[iLoop]);
    }

    free(p);

   return 0;
}

上例中指针访元素问也可以使用p[iLoop];象数组一下形式,他们是多么“亲近”和“亲密”。

论坛徽章:
0
7 [报告]
发表于 2006-03-27 22:25 |只看该作者
字符串的几个不同层面的含义

1、源文件中出现的 "abc" 这样的字符串
这种叫做字符串字面常量,只在代码中有效。这种字面常量具有内部链接性,编译器会在每个编译单元内部为这个字符串分配空间存储。因为是常量,它所位于的内存空间通常是不可写的。

2、一个以 '\0' (ASCII NUL字符)结束的字符数组。或者更确切的说,一个包含了各种 ASCII 可打印字符的、以 '\0' 为结束的字符数组。这是 C 语言语义上的字符串定义,不涉及编译、链接的特性,但是 <string.h>和<stdio.h> 头文件中的诸多函数都是以次为依据进行处理的。strlen / strcpy / strdup 等函数在进行识别字符串的时候,只依照是否出现 '\0' 为判断条件。

字符数组,char CHARRAY[arraysize],是一个更低层面上的意义,它表示一块连续的、包含 char 类型元素的内存区间。其中的内容是否是合法的 ASCII 字符串,是否以 '\0' 结束,并不影响它作为一个字符数组的本质。当这个数组作为局部变量或者全局变量进行分配的时候,可以使用 sizeof 操作符得到整个数组所占据的空间。这个值与其中包含的字符串的 strlen 不必须相同,通常情况下也是不会相等的。

字符指针,char *,表示一个指向 char 类型元素的指针。对它进行解除引用得到的是单个的 char。由于 C 语言支持指针算术运算(对 char *p 支持 ++p; --p; p + 2 等操作),可以通过一个 char * 方便地访问连续范围的字符串,因此通常使用 char * 来引用一个逻辑意义上的字符串。

论坛徽章:
0
8 [报告]
发表于 2006-03-28 10:28 |只看该作者
原帖由 usbboy 于 2006-3-26 17:22 发表
这里的字符串 不是字符串常量,
实际上这里的字符串 包含两重意思:
1.字符串常量 2.字符数组
实际上字符串常量也是存在内存的某个地方的 只是你不能直接知道它的地址,编译系统自动分配并访问
字符串常量不光地 ...



谢谢,有独辟的见解.能,能,能够看懂,真有看君一席话,胜读十年书呀!

回到原文,那里的字符串实际上是能用字符常量的.能够运行出结果来.所以,第一句话可能有一点错误吧

谢谢了

论坛徽章:
0
9 [报告]
发表于 2006-03-28 10:31 |只看该作者
原帖由 hkwang66 于 2006-3-26 20:46 发表
在 the_c_programming_language 中把指针和数组安排则一个章节描述的,可见指针和数组关系有多么“亲密”,比如sArray编译器就是把其转换成*(sArray+i)的;
再比如:C语言中能实现动态数组吗?使用指针就可以 ...





当中的#include<stdlib.h>是什么样的库函数啊?

论坛徽章:
0
10 [报告]
发表于 2006-03-28 10:36 |只看该作者
原帖由 wolf0403 于 2006-3-27 22:25 发表
字符串的几个不同层面的含义

1、源文件中出现的 "abc" 这样的字符串
这种叫做字符串字面常量,只在代码中有效。这种字面常量具有内部链接性,编译器会在每个编译单元内部为这个字符串分配空间存储。 ...


sizeof与 strlen,为什么其测的长度会不同呢?
就是因为'\0'的原因吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP