平时都用的是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的更多相关文章

  1. 【C/C++】字符数组:char,char*,char a[], char *a[], char **s 的区别与联系/const char*和char*的区别

    一.char,char*,char a[], char *a[], char **s 的区别与联系 C语言中的字符串是字符数组,可以像处理普通数组一样处理字符串. 可以理解为在内存中连续存储的字符. ...

  2. char* 和char[]的区别

    以下内容均来自互联网,系笔者汇总并总结. 1. 问题介绍 问题引入:在实习过程中发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="ab ...

  3. 【转】深入理解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 ...

  4. char*和char []

    1.char *s1 = "ssss"; 2.char s2[] = "bbbb"; 对于第一种,我是无法理解,无法想象字符串赋值给一个char类型的指针,查了 ...

  5. [转载]char * 和char []的区别---之第二篇

    原文地址:http://blog.sina.com.cn/s/blog_74a4593801019keb.html main() { char *p="abc123ABC";//c ...

  6. [转载]char * 和char []的区别---之第一篇

    char *  和char []的区别---之第一篇 原文地址http://blog.csdn.net/yahohi/article/details/7427724 在C/C++中,指针和数组在很多地 ...

  7. C语言中char* 和 char []区别

    想要把丢掉的东西捡起来,还是很辛苦啊,今天我就发现,我连char* 和 char []的区别都不知道. 很多人觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指正. 本质上 ...

  8. C语言char[]和char*比较

    先看看一个例子: #include <iostream> using namespace std; main() { char *c1 = "abc"; char c2 ...

  9. const char*、char*、char* const、char[]、string的区别

    1.const char* p: p is a pointer to const char(char const* p 一样)   意思就是不能通过p指针来修改p指向的内容(但是内容可以修改). 2. ...

  10. 【转】深入 char * ,char ** ,char a[ ] ,char *a[] 内核

    原文出处:http://blog.csdn.net/daiyutage/article/details/8604720    C语言中由于指针的灵活性,导致指针能代替数组使用,或者混合使用,这些导致了 ...

随机推荐

  1. 学习鸟哥的Linux私房菜笔记(7)——文件查找与文件管理1

    一.可执行文件的搜索 which 显示一个可执行文件的完整路径 按照alias->$PATH的顺序查找 查看系统的环境变量 whereis 搜索一个可执行工具及其相关配置.帮助 slocate ...

  2. Light libraries是一组通用的C基础库,目标是为减少重复造轮子而写(全部用POSIX C实现)

    Light libraries是一组通用的C基础库,目标是为减少重复造轮子而写实现了日志.原子操作.哈希字典.红黑树.动态库加载.线程.锁操作.配置文件.os适配层.事件驱动.工作队列.RPC.IPC ...

  3. Android开发小知识

    修改Android app图标(Android Studio) 1.  res\drawable 放置icon.png(此图片是你需要修改的图标); 2.  修改AndroidManifest.xml ...

  4. c语言学习笔记(5)——进制

    进制 1.什么叫进制?  逢n进1: 2.把r进制转成十进制 a*r^0+b*r^1+c*r^2..... 3.把十进制转成r进制 185----->(r进制) 185不停的除r取余,最后把余数 ...

  5. Matlab Tricks(二十八)—— 笛卡尔积的实现

    笛卡尔积在数学上是一种二元关系,笛卡尔积作用的双方是两个集合,作用的结果是一个新的集合. A×B={(a,b)|a∈Aandb∈B} 现有两向量: >> p = [1, 5, 10]; & ...

  6. WPF(C#)中Bitmap与BitmapImage相互转换

    原文:WPF(C#)中Bitmap与BitmapImage相互转换 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wangshubo1989/art ...

  7. WPF多点触摸放大缩小旋转

    原文:WPF多点触摸放大缩小旋转 版权声明:本文为博主原创文章,需要转载尽管转载. https://blog.csdn.net/z5976749/article/details/40118437 如果 ...

  8. cat监控平台环境搭建 专题

    项目地址:https://github.com/dianping/cat 编译步骤: 这个项目比较另类,把编译需要的jar包,单独放在git分支mvn-repo里了,而且官方文档里给了一个错误的命令提 ...

  9. spring boot 集成mybatis连接oracle数据库

    1. POM文件添加依赖 <!-- Mybatis --> <dependency> <groupId>org.mybatis.spring.boot</gr ...

  10. js css加时间戳

    为了强制更新文件,取消浏览器缓存 <link rel="stylesheet" href="~/XXX.css?time='+new Date().getTime( ...