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语言中由于指针的灵活性,导致指针能代替数组使用,或者混合使用,这些导致了 ...
随机推荐
- T-SQL部分函数(转)
函数类别 作用 聚合函数 执行的操作是将多个值合并为一个值.例如 COUNT.SUM.MIN 和 MAX. 配置函数 是一种标量函数,可返回有关配置设置的信息. 转换函数 将值从一种数据类型转换为另一 ...
- java基础——try catch final
1.不管有木有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return后面的表达式运算后执行的(此时并没有 ...
- Apparatus, system, and method for automatically minimizing real-time task latency and maximizing non-real time task throughput
An apparatus, system, and method are provided for automatically minimizing Real-Time (RT) task laten ...
- 保护SSD,设置Chrome浏览器临时文件夹到ramdisk分区
很多用低端/山寨SSD的朋友都用Ramdisk来保护硬盘,一般都把系统temp目录和IE浏览器临时文件夹目录设到Ramdisk分区了. 最近用谷歌的chrome浏览器,发现浏览网页时候硬盘灯 ...
- win7 64位系统下进入debug
win7 64位无法直接通过命名行输入debug命令的方式进入到debug,好在我们可是使用一个工具DOSbox来进入debug.操作步骤如下:1.下载DOSbox进行安装.下载地址:点击打开链接.如 ...
- LVS实现负载均衡原理及安装配置
LVS实现负载均衡原理及安装配置 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F ...
- jxl导出Excel
首先先在自己工程中导入jxl的jar包: 疯狂google后找到一段别人的导出excel方法,先备份于下面: import java.io.File; import java.io.FileOutpu ...
- 论题Cascade Object Detection with Deformable Part Models一个怀疑
该文的作者是Pedro F. Felzenszwalb等一下,著名DPM在目标检测模型.本文的工作是DPM(变形组件模型)级联,以加快检测速度. 加速的方式,现在其次是计算总结成绩的某些部分,假设小于 ...
- 在.net MVC项目中使用ajax进行数据验证
1.首先要在网页引入应该引入的js文件 在这里回顾一下在模板页里面挖坑的技术 2.在html中使用html辅助方法 3.验证模型 4验证方法
- 用Python模拟浏览器操作
两种思绪三种要领: 用pamie.建议不要使用,因为pamie为小我私人开发,里面的bug比力多,并且是直接使用win32com体式格局的,如果ie不警惕修改了,后果很严重.另外,pamie3使用的是 ...