字符数组VS字符指针

原创 2011年01月16日 00:45:00

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],也就是说尽管s1和s2都是字符数组,但两者的类型却是不同的。
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*。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

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

  • 2015年04月13日 21:48
  • 4KB
  • 下载

字符指针vs字符数组

1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc/0" 2."abc"是常量吗?答案是有时是,有时不是。 不是常量的情况...

C语言中字符数组和字符串指针分析

 这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么用到过C,虽然网上这类的文章也有很多,还是决定自己在这...

第十七周实验报告三(指针访问字符数组)

实验目的:揭开关于你生世的秘密 实验内容:简单的处理日期 * 程序头部注释开始 * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rig...

字符串指针和字符数组的又一区别

前面已经转载了一篇文章《字符串指针和字符数组的区别》,这里我读书的过程中发现了另一个区别点: 下面看一个例子: #include int main() { char name[10]="abcdef...

使用字符串指针变量和字符数组的区别

用字符数组和字符指针变量都可实现字符串的存储和运算。 但是两者是有区别的。在使用时应注意以下几个问题: 1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首...
  • zhjqxy
  • zhjqxy
  • 2016年11月01日 14:50
  • 165

字符串指针和字符数组,静态全局、静态局部、全局和局部变量区别,字符串常量和字符串变量,程序的内存分配

C语言学习中的知识点,字符串指针和字符数组的区别,静态全局变量、静态局部变量、全局变量和局部变量的区别, 有错误的地方请大家指正! 以下程序用VC++6.0调试 先说说字符串指针和字符数组的区别 1....

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

用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题: 1.     字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符数组VS字符指针
举报原因:
原因补充:

(最多只允许输入30个字)