C++中字符数组和字符串有什么区别,使用的时候,还有存储什么的。
3个回答
展开全部
事实上字符串是形如"abcd",在C++里面是const char*或者char const*这样,而字符数组却不是这样,类型是char*。"abcd"这样的字符串文字量保存在字符串文字量里面,而char[]或char*只算是一个数字(数码),下面是main.cpp文件的例子:
#include <cstdio>
int main()
{
char v[]={'a','b','c','d','\0'};
std::printf("abcd");
std::printf("%s",v);
return "abcd"==&v[0];
}
这一段代码,在GCC下生成的汇编代码是:
.file "main.cpp"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "abcd\0"
LC1:
.ascii "%s\0"
.section .text.startup,"x"
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
LFB9:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $32, %esp
call ___main
movb $97, 27(%esp)
movb $98, 28(%esp)
movb $99, 29(%esp)
movb $100, 30(%esp)
movb $0, 31(%esp)
movl $LC0, (%esp)
call _printf
leal 27(%esp), %eax
movl %eax, 4(%esp)
movl $LC1, (%esp)
call _printf
xorl %eax, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
LFE9:
.def _printf; .scl 2; .type 32; .endef
很明显,"abcd"和char v[] = {'a','b','c','d','\0'};是完全不同的,这里面一个char如'a'实际的码在系统里面在影射到特定的文字量去。
字符串放在字符串文字量储布区里面,在main()结束后才会被销毁。这个是可以确定的。
但是我不是做汇编的,不知道最精确的说法;但从上面的结果来看,很显然
movb $97, 27(%esp)
movb $98, 28(%esp)
movb $99, 29(%esp)
movb $100, 30(%esp)
movb $0, 31(%esp)
就是把数字一个一个在放到对应的地址上去
而"abcd"则处理为.ascii "%s\0"这一分区段上去
#include <cstdio>
int main()
{
char v[]={'a','b','c','d','\0'};
std::printf("abcd");
std::printf("%s",v);
return "abcd"==&v[0];
}
这一段代码,在GCC下生成的汇编代码是:
.file "main.cpp"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "abcd\0"
LC1:
.ascii "%s\0"
.section .text.startup,"x"
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
LFB9:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $32, %esp
call ___main
movb $97, 27(%esp)
movb $98, 28(%esp)
movb $99, 29(%esp)
movb $100, 30(%esp)
movb $0, 31(%esp)
movl $LC0, (%esp)
call _printf
leal 27(%esp), %eax
movl %eax, 4(%esp)
movl $LC1, (%esp)
call _printf
xorl %eax, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
LFE9:
.def _printf; .scl 2; .type 32; .endef
很明显,"abcd"和char v[] = {'a','b','c','d','\0'};是完全不同的,这里面一个char如'a'实际的码在系统里面在影射到特定的文字量去。
字符串放在字符串文字量储布区里面,在main()结束后才会被销毁。这个是可以确定的。
但是我不是做汇编的,不知道最精确的说法;但从上面的结果来看,很显然
movb $97, 27(%esp)
movb $98, 28(%esp)
movb $99, 29(%esp)
movb $100, 30(%esp)
movb $0, 31(%esp)
就是把数字一个一个在放到对应的地址上去
而"abcd"则处理为.ascii "%s\0"这一分区段上去
展开全部
字符数组 char a[100]; 可以随便你对元素赋值
常量字符串 char* a = 'abcde'; 不能随便赋值
动态分配字符串
char *a = malloc(100);
strncpy(a, 'abcd', 0);
拷贝了4个字符
常量字符串 char* a = 'abcde'; 不能随便赋值
动态分配字符串
char *a = malloc(100);
strncpy(a, 'abcd', 0);
拷贝了4个字符
追问
我问的是楼下那位列出的定义方式的区别
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
唯一的区别就是字符串末尾有一个'\0'作为结束标志;字符数组是没有的.
简单例子:
char ch1[]="hello";//该串有6个字符,5个可见字符,因为是串,所以末尾自动加上'\0';共六个
char ch2[]={'h','e','l','l','o'};//这样写就成了数组.是确确实实的5个字符
简单例子:
char ch1[]="hello";//该串有6个字符,5个可见字符,因为是串,所以末尾自动加上'\0';共六个
char ch2[]={'h','e','l','l','o'};//这样写就成了数组.是确确实实的5个字符
追问
vc2010用你的ch2定义的字符数组输出是带有乱码的,用数组方式定义一定是需要有'\0'的= =
追答
这个是编辑器的问题,而我说的只是两者之间的区别,也是你想知道的答案。。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询