char、char*、char**数组(有图,非常清楚)good
平时都用的是char数组,基本忘记了char*数组和char**数组该怎么用了
char s1[10];
s1[0] s1[1]等都是char
s1是char*,等同于&s1[0]
char*s2[10];
s2[0] s2[1]等都是char*
*s2[0] *s2[1]等都是char,是s2[0] s2[1]指向的字符串的第一个字符
s2是char**,等同于&s2[0]
char**s3[10];
s3[0] s3[1]等都是char**
*s3[0] *s3[1]等都是char*,是s3[0],s3[1]这些char**指针指向的那个char*指针
**s3[0] **s3[1]等都是char,是*s3[0] *s3[1]这些char*指针指向的字符串的第一个字符
s3是char***,等同于&s3[0]
char s1[3];
char*s2[3];
char**s3[3];
s1[0]='1';
s1[1]='2';
s1[2]='3';
s2[0]=&s1[0];
s2[1]=s1;
s3[0]=&s2[0];
s3[1]=s2;
内存中的数据如下图

明确这一点:指针的值就是它所指向的那个地址,对指针做*运算,就是把指针所指向的那个地址的值取出来
s1[0] s1[1] s1[2]存放的是字符
s1这个char*指针的值是0x0012ff60,说明s1这个char*指针指向的地址是0x0012ff60, 这个地址处存放着s1[0]这个字符。
s2[0]是一个char*指针,指向字符串”1234”
*s2[0]是第一个字符 ‘1’
s2这个char**指针的值是0x0012ff4c,说明s2这个char**指针指向的地址是0x0012ff4c,这个地址处存放着一个char*指针,也就是s2[0]。
s2[0]这个char*指针的值是0x0012ff60,和s1这个char*指针的值相同,说明s2[0]这个char*指针指向的地址也是0x0012ff60,这个地址存放着s1[0]这个字符。
s2[0]=&s1[0];
s2[1]=s1;
因为s1等同于&s1[0],所以s2[1]这个char*指针的值也是0x0012ff60。
s3这个char***指针的值是0x0012ff38,说明s3这个char***指针指向的地址是0x0012ff38,这个地址处存放着一个char**指针,也就是s3[0]。
s3[0]这个char**指针的值是0x0012ff4c,和s2这个char**指针的值相同,说明s3[0]这个char**指针指向的地址也是0x0012ff4c,这个地址存放着s2[0]这个char*指针
s3[0]=&s2[0];
s3[1]=s2;
因为s2等同于&s2[0],所以s3[1]这个char**指针的值也是0x0012ff4c
下面是一张简单的示意图

char s1[4]="123";
//char* s2=&s1[0];
char* s2=s1;
char**s3=&s2;
cout<<s2<<endl;
cout<<s3<<endl;
cout<<*s3<<endl;
printf("%dn",s3);
printf("%xn",s3);
上面这段代码的输出如下图

(1245012转成16进制就是12ff54)
可以看到,cout<<s2输出的是s2这个char*指针指向的地址处存放的数据,是一个字符串。
cout<<s3 输出的是s3这个char**指针指向的地址处存放的数据,是一个char*指针(指针就是一个地址),其值是0012ff54,也就是说这个char*指针指向的地址是0012ff54
cout<<*s3 输出的是s3这个char**指针指向的那个char*指针所指向的地址处存放的数据,是一个字符串。
可以总结,打印输出一个指针,输出的是指针所指向的地址处所存储的数据
变量其实就是一个地址。普通变量比如int i,i这个变量名就等同于内存中为这个变量分配的地址中存放的数据,这里是一个4字节的整数。和汇编中的直接寻址是不是很像?
指针变量比如char*s,s这个变量名还是等同于内存中为这个变量分配的地址中存放的数据,不过这里的数据不是普通的整数或浮点数数据,而是一个4字节的地址。*s就是这个4字节的地址处存放的数据。是不是和汇编中的间接寻址很像?&s就是内存中为这个变量分配的地址。考虑到我们输出s的时候,输出的都是s这个地址处存放的数据,如果想知道s这个4字节地址本身的值,可以int i=(int)s。

http://blog.sina.com.cn/s/blog_6f3d8a850102vm5u.html
char、char*、char**数组(有图,非常清楚)good的更多相关文章
- 【C/C++】字符数组:char,char*,char a[], char *a[], char **s 的区别与联系/const char*和char*的区别
一.char,char*,char a[], char *a[], char **s 的区别与联系 C语言中的字符串是字符数组,可以像处理普通数组一样处理字符串. 可以理解为在内存中连续存储的字符. ...
- char* 和char[]的区别
以下内容均来自互联网,系笔者汇总并总结. 1. 问题介绍 问题引入:在实习过程中发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="ab ...
- 【转】深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
一.可能的组合: (1)const char*p (2)char const*p (3)char *const p(4)const char **p (5)char const**p (6)char ...
- char*和char []
1.char *s1 = "ssss"; 2.char s2[] = "bbbb"; 对于第一种,我是无法理解,无法想象字符串赋值给一个char类型的指针,查了 ...
- [转载]char * 和char []的区别---之第二篇
原文地址:http://blog.sina.com.cn/s/blog_74a4593801019keb.html main() { char *p="abc123ABC";//c ...
- [转载]char * 和char []的区别---之第一篇
char * 和char []的区别---之第一篇 原文地址http://blog.csdn.net/yahohi/article/details/7427724 在C/C++中,指针和数组在很多地 ...
- C语言中char* 和 char []区别
想要把丢掉的东西捡起来,还是很辛苦啊,今天我就发现,我连char* 和 char []的区别都不知道. 很多人觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指正. 本质上 ...
- C语言char[]和char*比较
先看看一个例子: #include <iostream> using namespace std; main() { char *c1 = "abc"; char c2 ...
- const char*、char*、char* const、char[]、string的区别
1.const char* p: p is a pointer to const char(char const* p 一样) 意思就是不能通过p指针来修改p指向的内容(但是内容可以修改). 2. ...
- 【转】深入 char * ,char ** ,char a[ ] ,char *a[] 内核
原文出处:http://blog.csdn.net/daiyutage/article/details/8604720 C语言中由于指针的灵活性,导致指针能代替数组使用,或者混合使用,这些导致了 ...
随机推荐
- cellForRowAtIndexPath 设置图片
#import "UIImageView+MJWebCache.h" #import "MJPhotoBrowser.h" #import "MJPh ...
- Erlang 转至维基百科
Erlang(英语发音:/ˈɜrlæŋ/)是一种通用的并行程序设计语言,它由乔·阿姆斯特朗(Joe Armstrong)在瑞典电信设备制造商爱立信所辖的计算机科学研究室开发,目的是创造一种可以应付大规 ...
- NOIP模拟 MST - 类次小生成树
题目大意: 给一张无向图,可以将图中权值为v的边修改为k-v,求修改后的最小生成树边权和. 题目分析: 最小生成树的环切定理:任何非树边一定比对应树链上的所有边权值要大.否则我们可以将链上最大的树边删 ...
- 网站多语言转换.利用Google 语言的js.贴到网站就能用.
<div id="google_translate_element"></div><script>function googleTranslat ...
- CentOS虚拟机克隆后IP设置
1.网卡设置 vim /etc/udev/rules.d/70-persistent-net.rules 将新生成的eth1改名为eth0,并将原来的eth0注释或删除,同时复制mac地址 2.IP设 ...
- CSS(网页样式语言)基础
所谓全栈,个体可以独立地完成系统的设计.开发.测试.部署以及运维.打通一个领域从无到有的全过程. 为什么会有 markdown 文本编辑显示工具呢,因为 html 太重了.markdown 是 htm ...
- 【转】解决yum安装软件报Couldn't resolve host 'mirrorlist.centos.org问题
转自:http://blog.51cto.com/oldcat1981/1719825 今天在linux环境通过yum安装软件报了以下错误: [root@multi-mysql yum.rep ...
- MongoDB 通过自带工具命令进行备份表,再将备份表还原出数据
创建一个bat文件 在其中输入以下3行 第1行进入工具mongodump所在的目录 第2行 将Adam数据库里面的 第3行 将上面存在C:\Data\Dump\Adam\文件夹里面的TBLQuickS ...
- OpenCV实现朴素贝叶斯分类器诊断病情
贝叶斯定理由英国数学家托马斯.贝叶斯(Thomas Baves)在1763提出,因此得名贝叶斯定理.贝叶斯定理也称贝叶斯推理,是关于随机事件的条件概率的一则定理. 对于两个事件A和B,事件A发生则B也 ...
- 创建可按比例调整的布局的 Windows 窗体
能够正确调整大小的窗体可以提高您的用户界面的易用性. 此演练演示了如何创建当用户调整窗体大小时按比例调整的布局. 您将使用 TableLayoutPanel 控件实现一个接收联系人信息的数据输入窗体. ...