`
totoxian
  • 浏览: 1073983 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

字符数组VS字符指针

阅读更多
1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc\0"
2."abc"是常量吗?答案是有时是,有时不是。
不是常量的情况
"abc"作为字符数组初始值的时候就不是,如char str[] = "abc";因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"abc",而又因为字符数组就是把字符一个一个地存放的,所以编译器把这个语句解析为char str[3] = {'a','b','c'};又根据上面的总结1,所以char str[] = "abc";的最终结果是char str[4] = {'a','b','c','\0'};做一下扩展,如果char str[] = "abc";是在函数内部写的话,那么这里的"abc\0"因为不是常量,所以应该被放在栈上。
是常量的情况
"abc"赋给一个字符指针变量时,如char* ptr = "abc";因为定义的是一个普通指针,并没有定义空间来存放"abc",所以编译器得帮我们找地方来放"abc",显然,把这里的"abc"当成常量并把它放到程序的常量区是编译器最合适的选择。所以尽管ptr的类型不是const char*,并且ptr[0] = 'x';也能编译通过,但是执行ptr[0] = 'x';就会发生运行时异常,因为这个语句试图去修改程序常量区中的东西。记得哪本书中曾经说过char* ptr = "abc";这种写法原来在c++标准中是不允许的,但是因为这种写法在c中实在是太多了,为了兼容c,不允许也得允许。虽然允许,但是建议的写法应该是const char* ptr = "abc";这样如果后面写ptr[0] = 'x'的话编译器就不会让它编译通过,也就避免了上面说的运行时异常。又扩展一下,如果char* ptr = "abc";写在函数体内,那么虽然这里的"abc\0"被放在常量区中,但是ptr本身只是一个普通的指针变量,所以ptr是被放在栈上的,只不过是它所指向的东西被放在常量区罢了。
3.数组的类型是由该数组所存放的东西的类型以及数组本身的大小决定的。
char s1[3]char s2[4]s1的类型就是char[3]s2的类型就是char[4],也就是说尽管s1s2都是字符数组,但两者的类型却是不同的。
4.字符串常量的类型可以理解为相应字符常量数组的类型,如"abcdef"的类型就可以看成是const char[7]
5.sizeof是用来求类型的字节数的。如int a;那么无论sizeof(int)或者是sizeof(a)都是等于4,因为sizeof(a)其实就是sizeof(type of a)
6.对于函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通的指针类型,如对于void func(char sa[100],int ia[20],char *p)sa的类型为char*ia的类型为int*p的类型为char*,如下面是常见的笔试题目:
char str[] = www.ibegroup.com
sizeof (str ) = ?(1
void Foo ( char str[100]){
请计算
sizeof( str ) = ?(4
}
7.根据上面的总结,来实战一下:
对于char str[] = "abcdef";就有sizeof(str) == 7,因为str的类型是char[7]
也有sizeof("abcdef") == 7,因为"abcdef"的类型是const char[7]
对于char *ptr = "abcdef";就有sizeof(ptr) == 4,因为ptr的类型是char*
对于char str2[10] = "abcdef";就有sizeof(str2) == 10,因为str2的类型是char[10]
对于void func(char sa[100],int ia[20],char *p),就有sizeof(sa) == sizeof(ia) == sizeof(p) == 4,因为sa的类型是char*ia的类型是int*p的类型是char*
分享到:
评论

相关推荐

    字符数组与字符指针

    ### 字符数组与字符指针详解 #### 一、引言 在C/C++编程语言中,字符数组和字符指针是非常重要的数据类型,尤其是在处理文本数据时。这两种类型的使用非常广泛,但在实际编程过程中,不少开发者往往会在它们之间...

    字符数组字符指针sizeofstrlen的一点总结

    ### 字符数组与字符指针详解 #### 一、字符数组与字符指针的基本概念 在C语言中,字符数组和字符指针是处理文本数据的两种常见方式。字符数组通常用于存储固定长度的字符串,而字符指针则用于指向字符串的首地址。...

    数组指针和指针数组的区别

    但是,p3 的定义是正确的,而 p4 的定义是错误的,因为 p4 的右边是一个指向单个字符的指针,而左边是指向整个数组的指针。 五、地址的强制转换 在下面的例子中,我们定义了一个结构体 Test: ```c struct Test{ ...

    栈字符数组&混淆指针和数组所导致的错误

    在编程世界中,栈字符数组和指针与数组的关系是两个重要的基础知识,它们在实际编程中经常被使用,但同时也容易引发错误。本文将详细探讨这两个主题,旨在帮助你理解和避免相关的问题。 首先,让我们来看看栈字符...

    字符串指针与字符数组的区别

    字符串指针字符串指针与字符数组的区别与字符数组的区别 转载

    整形数组与字符数组相互转换

    本示例涉及的是整形数组(int array)与字符数组(uchar array)之间的转换,这对于数据存储和传输具有重要意义。在Qt或VC++环境中,这种转换对于数据库交互,特别是当数据库要求特定数据格式时,尤为关键。 首先,...

    C语言中关于字符数组与字符指针

    其中,字符数组(char array)和字符指针(char pointer)是经常被拿来对比的两个概念。本文将详细讲解字符数组与字符指针在C语言中的区别、用法,以及它们在实际编程中的应用场景。 首先,需要明确的是字符数组和...

    C语言第讲指针与字符串字符数组PPT课件.pptx

    1. **字符指针与字符数组的区别** - **存储格式**:字符指针(变量)存储的是字符串的首地址,即一个内存地址(通常为2字节)。而字符数组则是存储整个字符串,每个数组元素存储一个字符。 - **性质差异**:字符...

    C语言用指针将字符串数组位置颠倒

    C语言用指针将字符串数组位置颠倒,实现ABCDEFGHIJKLMNOPQRSTUVWXYZ转换成ZYXWVUTSRQPONNOPQRSTUVWXYZ

    用指针数组的方法将字符串排序

    每个元素都是一个指向字符数组(即字符串)的指针。 2. **字符串排序**:字符串排序通常是指按照字典顺序对字符串进行排序,可以是升序或降序。在计算机科学中,排序算法是基础而关键的一部分,它影响着数据处理的...

    C#将字符串数组传递给C++ DLL.rar

    注意,由于是宽字符数组,我们应使用`LPCWSTR`(常量宽字符指针)来处理每个字符串: ```cpp void ProcessStrings(int count, wchar_t** strings) { for (int i = 0; i ; i++) { wprintf(L"%ls\n", strings[i]);...

    C语言教学课件:14-3_指针数组(用于处理二维数组或多个字符串).ppt

    例如,下面是一个两维字符数组的定义: ```c char color1[][6]={"RED","GREEN","BLUE"}; ``` 这个数组的每个元素是一个字符串,而不是指针。相比之下,指针数组的每个元素是一个指针,指向一个字符串。 四、指针...

    c#调用VC编写的DLL 涉及到字符串 字符串数组用法

    C#中的字符串是基于.NET Framework的`System.String`类,它是不可变的,而C++中字符串通常是以字符数组(char*或wchar_t*)的形式存在。在传递字符串时,我们需要考虑内存管理,因为C#和C++对内存的处理方式不同。 ...

    C语言字符数组与字符串的使用详解[归类].pdf

    在C语言中,有两种方式表示和存放字符串:使用字符数组和使用字符指针。使用字符数组时,例如`char str[] = "I love China";`,字符串将被存储在一个字符数组中。使用字符指针时,例如`char* str = "I love China";`...

    指针与数组区别,实验与指导-数组指针字符串

    指针与数组区别,实验与指导-数组指针字符串 在 C++ 编程中,指针和数组是两个基本概念。指针是一种变量,它存储了另一个变量的内存地址,而数组是一组相同类型的变量的集合。 understanding the difference ...

    第8章 指针-3字符数组和字符指针 - 字符串的输入和输出1

    在C语言中,字符数组和字符指针是处理字符串(以'\0'为结束符的字符序列)的重要工具。本章主要讨论了如何通过指针进行字符串的输入和输出。 首先,字符数组用于存储字符串。例如,定义了一个大小为81(包括一个...

    第9章 指针和数组-4指针数组及其应用 - 用指针数组表示多个字符串1

    本章主要讨论了如何使用指针数组来存储和操作多个字符串,以及这种存储方式相对于二维字符数组的优势。 首先,我们来看一个常见的问题:如何有效地存储一组字符串?一种方式是使用二维字符数组,如`char country[]...

    请用指针数组的方法将字符串排序

    在IT领域,特别是编程技术中,使用指针数组对字符串进行排序是一个常见且实用的技巧。根据提供的代码示例,我们可以深入探讨这一知识点,包括其原理、实现过程以及实际应用。 ### 使用指针数组对字符串排序的原理 ...

Global site tag (gtag.js) - Google Analytics