1、以字符串形式出现的,编译器会在结尾自动添加\0,思考,为什么?

  存在的C语言方法,如strlen(s),计算字符串的长度,其中s指针。strlen要计算字符串长度,必须知道哪里是结尾,因此使用\0表示结尾。只有字符数组才有\0的概念,其它类型(int)的数组没有这个概念。因为其他类型的数组或者指针,没有strlen这种方法。

  那么问题来了,int数组如何计算长度呢?如int a1 = {3,7,9,};

  使用sizeof(a1)/sizeof(int)。

2、数组可以在栈上分配,也可以在堆上分配,但必须指定大小。

  char a1[100]; //在栈上分配

  char* pa = new char[100];// 在堆上分配,返回首元素的地址

3、char a1[] = "abc"; 相当于在栈顶分配4个字节,分别放上a,b,c,\0,等价于char a1 ={'a','b','c','\0'};

4、char* pa = "abc"; 分析一下就知道,pa是char指针,"abc"是一个文本字符串,显然类型不吻合,需要适配。可认为编译器做了下面的事情:在常量区分配4个字节,分别放上a,b,c,\0,然后把a的地址返回给pa。

  注意:文本字符串放在常量区,是不可修改的,试图修改,运行异常。那么在思考一下,既然右边是const,而pa并没有限定为const char*,按道理赋值失败。为什么可以成功?

  可以认为在C语言中,到处充斥着这样的代码。为了兼容,必须允许。但是,我们应该写const char* pa ="abc"; 这样的话,试图修改pa的内容,编译报错。

5、char a1[] = "abc", 等价于char a1[] = {'a','b','c','\0',}; strlen(a1)等于3,长度不包括\0

  假如这样写 char a1[] = {'a','b','c',}; strlen(a1)是多少? 答案不确定,因为strlen一直找到\0才认为是结尾。
6、 char a1[] = "abc"; 下面的结果分别是什么?

  cout<<&a1[0]<<endl;

  cout<<a1<<endl;

  输出相同,都是数组元素的第一个地址。

7、char* pa = "abc"; 下面的结果分别是什么?

  cout<<&pa<<endl;

  cout<<&pa[0]<<endl;

  cout<<pa<<endl;

  第一行输出pa在栈上的地址,第二行和第三行输出相同,都是首地址。pa是指针,就是指向首个元素的地址。

8、char a1[5]; 数组名是个指针常量,不能修改指向。

9、char* pa = "abc"; 可认为pa是个指向常量的指针。

10、下面的结果,违反直觉,按道理第4行,第5行应该输出地址。但是却输出指向的字符串。这有一定的合理性,我们打印char指针,往往是要看指向的内容,而不是要看地址是多少。而且cout很容易做到,只要遇到\0就结束。那么问题来了,我想看地址怎么办?使用int强制转化为地址。

  char a1[]="abc";
char* pa="def"; cout<<a1<<endl; //输出abc
cout<<pa<<endl; //输出def cout<<(int)a1<<endl; // 输出a1地址
cout<<(int)pa<<endl; // 输出pa地址

11、

  char p[]="abcde";
char* p2="abcde"; cout<<sizeof(p)<<endl; //数组大小为6
cout<<sizeof(p2)<<endl; // 指针大小为4 cout<<strlen(p)<<endl; // 长度为5
cout<<strlen(p2)<<endl; // 长度为5

char数组与char指针的更多相关文章

  1. char[]数组与char *指针的区别

    char[]数组与char *指针的区别 问题描述 虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了 ...

  2. c++ 踩坑大法好 char字符,char数组,char*

    1,基本语法 1,定义一个char字符: char hehe='a'; //单引号 2,定义一个由char字符组成的数组: char daqing[] = "abcd"; char ...

  3. char、char*、char**数组(有图,非常清楚)good

    平时都用的是char数组,基本忘记了char*数组和char**数组该怎么用了 char s1[10]; s1[0] s1[1]等都是char s1是char*,等同于&s1[0] char* ...

  4. c语言结构体中的一个char数组怎么赋值?

    目录 前景提示 这里的结构体处理的步骤 一.char数组类型的处理 二.char数组指针类型的处理 三.全部代码 1. char数组 2. char数组指针 结语 前景提示 定义一个结构体,结构体中有 ...

  5. C++ DWORD 转byte char 数组、指针

    C++ DWORD 转byte char 数组.指针 byte byteData[1024]; // byte数组,示例 DWORD dwData = dwReadBytes; // dword数据, ...

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

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

  7. C++ code:char pointers and char arrays(字符指针与字符数组)

    C-串的正确赋值.复制.修改.比较.连接等方式. #include<iostream> #pragma warning(disable: 4996)//这一句是为了解决“strrev”出现 ...

  8. PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组转换

    PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组之间的转换关系见下图 通过转换链,可以实现任意两个类型之间的互转.如PChar转PAnsiChar ...

  9. Delphi中的各种字符串、String、PChar、Char数组

    参考博客:http://www.cnblogs.com/pchmonster/archive/2011/12/14/2287686.html 其中的所有代码均在Delphi7下测试通过. Delphi ...

随机推荐

  1. 修改dbwr后台进程数量

    批量执行脚本时,批量数据写回到数据库:从EM中查看到有较多的dbwr的IO请求   查看后台dbwr的进程数量 select * from v$bgprocess 在查询结果中paddr的字段为非'0 ...

  2. 域名下Web项目重定向出现DNS域名解析错误问题

    问题: 项目使用的是阿里云的ESC,前几天为IP地址添加了域名 发现发送正常请求时跳转没问题,但发送重定向请求时,页面就会出现DNS域名解析错误的情况 1.我在Tomcat的server.xml中配置 ...

  3. [Everyday Mathematics]20150116

    设 $\al_n\geq 0$ 且 $\dps{\vlm{n}\al_n=0}$, 试求 $$\bex \vlm{n}\frac{1}{n}\sum_{k=1}^n \ln\sex{\frac{k}{ ...

  4. XtraGrid的若干种用法 z

    支持多种类型的数据集合作为数据源 XtraGrid与传统的DataGridView一样,支持多种类型作为其数据源.下面例子是将DataTable, List<T>和数组分别绑定到XtraG ...

  5. CAKeyframeAnimation

    之所以叫做关键帧动画是因为,这个类可以实现,某一属性按照一串的数值进行动画,就好像制作动画的时候一帧一帧的制作一样. 一般使用的时候  首先通过 animationWithKeyPath 方法 创建一 ...

  6. IOS AVAUDIOPLAYER 播放器使用

    1. 导入 AVFoundation.framework 2.导入头文件  #import <AVFoundation/AVFoundation.h> 3. player = [[AVAu ...

  7. 浅谈javascript的变量作用域

    1.变量遵循先声明再使用. console.log(b); b=123; 代码运行结果: Uncaught ReferenceError: b is not defined 2.方法内定义的局部变量外 ...

  8. 警惕javascript代码中的“</script>”!

    之前在写<博客园自定义博客侧边栏公告的过滤漏洞>的时候遇到了一个javascript代码报错“语法错误”的问题,一直不得以解决,感谢Arliang发现了并为我进行了耐心的解释,现整理如下: ...

  9. 当rsync遇到非默认端口的ssh

    在使用rsync使用ssh协议,来同步远程文件的方法,rsync -zvrtopg -e ssh但是如果遇到ssh不是22端口的时候使用rsync -zvrtopg -e ‘ssh -p 端口’特别是 ...

  10. Install_pygments

    安装Pygments语法高亮 On OS X Leopard, Snow Leopard 1 $ sudo easy_install Pygments Alternatively on OS X wi ...