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*

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*。

转自:http://fly-top.blog.163.com/blog/static/17275511220112225380435/

指针-->字符串的更多相关文章

  1. 【C++基础】 指针&字符串&数组

    先贴代码,总结以后再写,和5中内存分配方式密切相关 PS: str 返回整个字符串,str[0],*str返回首字符h char *strA(){ char str[]="hello!&qu ...

  2. c语言指针字符串与字符数组字符串的区别

    #include <stdio.h> int main() { //字符串常量,存放于内存常量区. //常量区区的内存具有缓存机制, //当不同指针指向的常量值相同时, //其实这些指针指 ...

  3. 数组字符串与指针字符串的区别 char s[]="***" 和char *s="***"的区别

    char s[] = "wangshihui"; char *s = "wangshihui"; 皆宣告了s字符串,在C-style string的函数皆可使用 ...

  4. lightoj 1293 - Document Analyzer [ 两指针 + 字符串 ]

    传送门 1293 - Document Analyzer   PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: ...

  5. c语言实现字符指针(字符串)数组的排序

    需求: "ff555d", "114ddd", "114dd","aaa", "aaab", &qu ...

  6. C语言-数组与指针 字符与字符串

    1 字符与字符串:char c='a'而不能写出char c="a" //字符变量用单引号'',而字符串用双引号. 2 字符数组与字符指针的初始化: char s[10]={0}, ...

  7. [C语言 - 3] 字符串

    字符数组 char * 看做一个特殊的字符数组, 在字符串结束为止添加'\0'结束符 (ASCII码0), 没有\0结尾的是普通的字符数组. 使用双引号定义的字符串自动在尾部加上\0 puts(s)函 ...

  8. day11基础代码——函数指针

    // //  main.m //  Demo11 // //  Created by scjy on 15/10/29. //  Copyright © 2015年 lizhipeng. All ri ...

  9. delphi字符串操作函数一览

    首部 function SameText(const S1, S2: string): Boolean; $[SysUtils.pas 功能 返回两个字符串是否相等 说明 不区分大小写 参考 < ...

随机推荐

  1. leetcode修炼之路——350. Intersection of Two Arrays II

    题目如下: Given two arrays, write a function to compute their intersection. Example: Given nums1 = [1, 2 ...

  2. SVN设置钩子文件限制提交文件时必须填写更新日志

    进入相应SVN仓库hooks目录,编辑文件pre-commit #!/bin/sh # PRE-COMMIT HOOK## The pre-commit hook is invoked before ...

  3. ORACLE调度之基于事件的调度(二)【weber出品】

    一.回顾 调度分基于时间的调度和基于事件的调度. 稍微复习一下前面的只是请浏览:<ORACLE调度之基于时间的调度(一)[weber出品]> 二.知识补充 1.队列:一种数据结构,就像一根 ...

  4. 【转】Hibernate和ibatis的比较

    1. 简介 Hibernate是当前最流行的O/R mapping框架.它出身于sf.net,现在已经成为Jboss的一部分了.iBATIS是另外一种优秀的O/R mapping框架,现已改名叫myB ...

  5. set_time_limit() 控制页面运行时间

    当你的页面有大量数据时,建议使用set_time_limit()来控制运行时间,默认是30s,所以需要你将执行时间加长点,如 set_time_limit(300)  ,其中将秒数设为0 ,表示持续运 ...

  6. 织梦DedeCms用SQL语句调用数据库任意内容

    dedecms多站点数据利用SQL句段进行互相调用数据方法:2个或者多个DEDE的站怎么互相调用数据,非JS调用,前提是2个或者多个dedecms站点都安装的同一个数据库的不同数据表内,才能实现功能. ...

  7. IIS principle

    IIS Request | | | Application Pool Config | | | W3WP | | | Many Module | | | AppDomain:这才是.NET的入口 | ...

  8. Shortest Prefixes

    poj2001:http://poj.org/problem?id=2001 题意:给你一些单词,然后让你寻找每个单词的一个前缀,这个前缀能够唯一表示这个单词,并且是最短的. 题解:直接用trie树来 ...

  9. KEIL C51中的_at_关键字

    绝对位置变量 变量可以在你的C程序中的绝对内存地址位于源模块使用_at_关键字.此功能的用法是: 类型 _ memory_space _ 变量名 _at _  常数 ; 其中:memory_space ...

  10. -_-#【Mac】命令

    切换cd $HOMEcd ~ 查看ls 查看系统显示:defaults write com.apple.finder AppleShowAllFiles -bool true隐藏:defaults w ...