平时都用的是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. 模块化模式与 OSGi

    模块化模式与 OSGi Android 模块化探索与实践 一.前言 万维网发明人 Tim Berners-Lee 谈到设计原理时说过:“简单性和模块化是软件工程的基石:分布式和容错性是互联网的生命.” ...

  2. 一起学Python:正则表达式概述

    re模块操作 在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re 1. re模块的使用过程 #coding=utf-8 # 导入re模块 import re # 使 ...

  3. freemarker中间split字符串切割

    freemarker中间split字符串切割 1.简易说明 split切割:用来依据另外一个字符串的出现将原字符串切割成字符串序列 2.举例说明 <#--freemarker中的split字符串 ...

  4. Risk Adaptive Information Flow Based Access Control

    Systems and methods are provided to manage risk associated with access to information within a given ...

  5. 【26.87%】【codeforces 712D】Memory and Scores

    time limit per test2 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...

  6. vue 使用ztree

    1 全局引入jquery , 不明白的看我上一个的随笔 , 特别简单 2 我没有封装组件 , 项目里面这个效果的只用了一次 , 没有必要 在你的<script>标签下面引入这俩东西 , 前 ...

  7. Method and apparatus for establishing IEEE 1588 clock synchronization across a network element comprising first and second cooperating smart interface converters wrapping the network element

    Apparatus for making legacy network elements transparent to IEEE 1588 Precision Time Protocol operat ...

  8. cookie登录功能实现

    站点经常使用的记住我,或是一周内自己主动登录,这些功能一般都是是用cookie进行登录的!以下对此功能进行分析: package cookielogin; import java.io.IOExcep ...

  9. listview分页载入问题

    方案一: 底部有查看很多其它能够使用HeaderViewListAdapter 假设须要加入数据, 就向Adapter绑定的数据里面加入. 然后调用Adapter.notifyDataSetChang ...

  10. 绑定到异步的ObservableCollection

    原文:绑定到异步的ObservableCollection 在进行WPF开发过程中,需要从一个新的线程中操作ObservableCollection,结果程序抛出一个NotSupportedExcep ...