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

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. 用最新的版本,蹦最野的迪~~~IDE写大数据程序避坑指南

    文章更新于:2020-04-05 注:本次实验使用的操作系统及各个程序版本号 类别 版本号 说明 操作系统 Ubuntu 16.04.6 LTS 代号 xenial jdk java version ...

  3. 家庭记账本app进度之下拉框和数字转轮的相关应用

    这次主要是悬系的下拉框Spinner和数字转轮NumberPicker的使用.先分析相关的用到的知识点. 在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例子 ...

  4. 修复Windows10引导,适用gpt+uefi环境

    在双硬盘多系统安装时,容易损坏Win10的开机引导文件. 可以尝试用Windows原版安装盘启动,进入命令提示符模式: 首先使用diskpart命令确认需要修复的Windows分区的安装卷X:. 再运 ...

  5. 【Selenium02篇】python+selenium实现Web自动化:鼠标操作和键盘操作!

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第二篇博 ...

  6. NonRegisteringDriver造成的内存频繁FullGc

    某天上服务器看了下gc情况,发现状况不对,启动了才2天的服务器发生了360次fullgc,这个频率肯定高了 说明 S0C.S1C.S0U.S1U:Survivor 0/1区容量(Capacity)和使 ...

  7. centOS7常用操作命令

    大多和DOS命令差不多 文件与目录操作 命令 解析 cd /home 进入 ‘/home’ 目录 cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd - 返回上次所在目录 cp fil ...

  8. 如何练习python?有这五个游戏,实操经验就已经够了

    现在学习python的人越来越多了,但仅仅只是学习理论怎么够呢,如何练习python?已经是python初学者比较要学会的技巧了! 其实,最好的实操练习,就是玩游戏. 也许你不会信,但这五个小游戏足够 ...

  9. stand up meeting 12-11

    今天因组员时间问题,并没有集中在一起开会,但士杰当面和天赋同学进行了沟通,在lync与国庆进行了沟通. 天赋与重阳再次进行了了沟通,确定了“单词挑战”与“背单词”这两个模块集成的难度,决定先不进行集成 ...

  10. 详解 File类

    在讲解File类之前,本人先要讲解下 路径,因为我们对于文件的操作是离不开路径的: 目录 路径: File类 文件名称过滤器: 路径: 请观看本人博文 -- <详解 绝对路径与 相对路径> ...