最近复习数据结构实验时,碰到这么一行代码,看的有点不爽。

typedef char** HuffmanCode;

借此梳理下数组和指针。

int* p; //指针变量p中存的地址代表的内存单元中的数据是整型

在32位平台下,由于p存的是地址,故p的值是32位。

不论p指向什么类型的数据,指针变量p本身都是整型。

c中没有string类型,所以一般用字符数组表示字符串。

char str[15] = "Hello World";

c规定数组名表示数组在内存中的首地址,就是str = &str[0],我们一般输出字符串时printf("%s",str);,首地址就可以输出整个字符串。

在c中可以这么干:

 char *s;
s = "Hello";

一个字符串赋值给一个指针变量??

事实上,c的编译器会给字符串常量分配内存,假设"Hello"的地址是0x0000000000404000 0x0000000000404001 0x0000000000404002 0x0000000000404003 0x0000000000404004 0x0000000000404005,(我是64位环境)

其实是s = "Hello" = 0x0000000000404000,c编译器把这个串看作首地址。

做个测试:

printf("%s\n",s);
printf("%s\n",0x0000000000404000);
这两行的效果是一样的。
char str[10];
char* s;

str表示首地址,s也保存首地址,所以可以这样:

s = str;
但是不可以 str = s;

因为数组名是一个常量,不能被赋值。

事实上,char str[10]编译器会分配10个内存单元,而char* s只是定义了一个指针变量,32位环境下只分配4个字节,用来保存字符串首地址。

不信测试下:

sizeof(str) = 10;
sizeof(s) = 4; //分配四个字节来保存地址

所以数组名和指针变量本质上是不同的。

接下来我们看看char**与char* a[]

对于char* a[],a实质上还是一个数组,这个数组保存的元素是char*类型的,char*也就是存着地址的变量。

所以可以这样:

char* a[] = {"me","you","him"};

这时在32位环境下sizeof(a) = 12,因为a中的3个元素都是char*指针,而指针变量占4个字节。

可以打印出来看看:

printf("%p %p %p\n",a[0],a[1],a[2]);
printf("%p %p %p\n",&a[0],&a[1],&a[2]);



数组中3个元素保存了3个地址,也就是3个字符串的首地址。

对于char** s

二级指针变量s保存一级指针char*的地址,我们可以:

s = a;

数组名a=&a[0]=62FE30,而这个地址中(即a[0])保存的是404000这个地址,也就是字符串"me"的首地址,即:

*s = 404000 = "me";

易错点1:

char** s = "Hello";

这是错的,因为s是char** ,而"Hello"是char*

虽然都是地址,但是"Hello"表示的地址中内容是H,char型;

s存的地址中的内容(*s)是char*型,指针类型。

易错点2:

char** s;
*s = "Hello";

这样编译不会错,但是运行时printf("%s",*s);就会崩溃。

假设s=0x1000,在0x1000内存单元中存的是"Hello"的地址0x2000,即*s = 0x2000,这样执行时先找到0x1000,然后是0x2000,没有问题。

char** s;,s存的是一个随机的地址,也就是野指针,*s就可能会崩溃。

所以要先分配一个地址:

char** s;
s = (char**) malloc(sizeof(char**));
*s = "Hello";

这样s就有了可用的地址。

参考:

https://blog.csdn.net/liusicheng2008_liu/article/details/80412586

Character Array and Character Pointer的更多相关文章

  1. Matlab一个错误引发的血案:??? Error using ==> str2num Requires string or character array input.

    Matlab总遇到一些神奇的问题,让人摸不着头脑.昨天编写程序的时候遇到一个让我十分火大的问题,也是自己的matlab基础不好吧. 先描述一下问题,再GUI界面有个listbox,Tag属性是’lis ...

  2. Convert character array to string in MATLAB

    Matlab提取特征值是经常要读取多个图片文件,把文件名保存在数组中后再读取会出错.从stackoverflow中找到如下解决方法: I've a M by N matrix, each cell c ...

  3. Java基础知识强化68:基本类型包装类之Character概述和Character常见方法

    1. Character概述: public final class Character extends Object implements Serializable,Comparable<Ch ...

  4. MATLAB知识-解决因缺少libsvm 而运行出现Y must be a vector or a character array.

    matlab版本R2014b 最近运行一个使用svmtrain的程序,出现以下错误: 这是因为是在设定路径里面没有libsvm.辛亏有一位师姐的电脑里面有libsvm的包,我直接用了,这样就不需要下载 ...

  5. Multi-Byte Character Set & Unicode Character Set

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49592361 编程时遇到BUG:err ...

  6. [转]Passing Managed Structures With Strings To Unmanaged Code Part 3

    1. Introduction. 1.1 In part 1 of this series of blogs we studied how to pass a managed structure (w ...

  7. [转]Passing Managed Structures With Strings To Unmanaged Code Part 2

    1. Introduction. 1.1 In part 1 of this series of blogs we studied how to pass a managed structure (w ...

  8. c pointer and array

    Pointer:  A pointer is a variable that contains the address of a variable. if c is a char and p is a ...

  9. Java.lang.Character类

    Character将一个char基本数据类型封装在类中.这个类中只有一char类型的变量.Character是基于unicode码进行的Character所有的方法,都是围绕着这个char基本数据类型 ...

随机推荐

  1. 【php】文件的上传与下载

    一. 生活中常见的地方: a) 例如邮箱.空间.文库.百度云.微爱等地方,都可以看到文件的上传和下载的应用,因此,上传和下载的功能非常重要!二. PHP当中的文件上传和下载 a) 我们需要进行一些设置 ...

  2. 关于wget下载jdk问题解决

    问题: 直接从jdk官网下载会出现: 正在解析主机 login.oracle.com (login.oracle.com)... 156.151.58.18正在连接 login.oracle.com ...

  3. 痞子衡嵌入式:走进二维码(QR Code)的世界(2)- 初体验(PyQt5.11+MyQR2.3+ZXing+OpenCV4.2.0)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是走进二维码(QR Code)的世界专题之初体验. 接上篇 <走进二维码(QR Code)的世界(1)- 引言> 继续更文,在 ...

  4. win下youtube-dl 【ERROR: requested format not available】选下载视频质量的坑--【值得一看】

    需求说明(bug出处): 简单说:下载youtube的视频,嵌入翻译好的中文字幕. 详细说(可略过): 阿里的海外服务器需要布一个Web Service---用以接收国内(本地服务器)的请求, 然后用 ...

  5. Js异步机制的实现

    Js异步机制 JavaScript是一门单线程语言,所谓单线程,就是指一次只能完成一件任务,如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推.这种模式的好处是实现起来比较简单 ...

  6. "选择图片"组件:<pickimage> —— 快应用组件库H-UI

     <import name="pickimage" src="../Common/ui/h-ui/media/c_pickimage"></ ...

  7. 【python实现卷积神经网络】padding2D层实现

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...

  8. syncronized如何上锁

    上锁,根据操作系统所说的原则,对共享变量上锁,对临界区上锁.谁访问临界资源?就给谁上锁 同步监视器,它上锁的对象. 1.用关键字给方法上锁 2.用synchronized代码块上锁 默认上锁对象:th ...

  9. 带权值的LCA

    例题:http://poj.org/problem?id=1986 POJ1986 Distance Queries Language: Default Distance Queries Time L ...

  10. SpringBoot集成Shiro实现权限控制

    Shiro简介 Apache Shiro是一个功能强大且易于使用的Java安全框架,用于执行身份验证,授权,加密和会话管理.使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序-从最小的移 ...