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

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. Flask 入门(十)

    flask 中的 db.relationship() 上文提到的方法,也可以找到狗的主人,但是,方便吗?,如果一个人有多只狗呢? 承接上文,修改main.py中的代码如下: #encoding:utf ...

  2. NullPointerException的处理新方式,Java14真的太香了

    在Java语言中,处理空指针往往是一件很头疼的事情,一不小心,说不定就搞出个线上Bug,让你的绩效考核拿到3.25.最近新出的Java14,相信大家都有所耳闻,那么今天就来看看,面对NullPoint ...

  3. 使用Maven Archetype创建Java项目模板

    1.over view 简而言之,Archetype是一个Maven项目模板工具包.原型被定义为一种原始的模式或模型,所有其他同类的东西都是从中产生的.当我们试图提供一个提供生成Maven项目的一致方 ...

  4. 聊一聊深拷贝和浅拷贝(JS)

    在 JS 中数据类型分为值类型和引用类型,对于值类型,变量中存放的是具体的值,而对于引用类型,变量中存放的是地址. 对于值类型: const a = 3; let b = a; b = 4; cons ...

  5. 使用spring连接mysql数据库出错

    最近在学习spring框架,但是在学到JdbcTemplate时连接数据库一直报错,百度谷歌各种查找都能没有解决问题,简直要癫狂,报错信息如下: org.springframework.jdbc.Ca ...

  6. Python财经数据接口包TuShare的使用

    安装TuShare 方式1:pip install tushare 方式2:访问https://pypi.python.org/pypi/tushare/下载安装 方式3:将源代码下载到本地pytho ...

  7. C. Beautiful Regional Contest

    用前缀和写一直wa.. 思路:让金牌和银牌最少,通多增加铜牌的方式来扩大总奖牌的个数. #include<bits/stdc++.h> using namespace std; map&l ...

  8. 一个好的olap框架

    一.何为一个好的olap框架? 框架大概分为两种: (1)底层技术框架,专注于抽象底层技术,如网络通信netty.中间件kafka等 (2)开发人员框架,专注于提高开发效率,如spring的面向切面和 ...

  9. MRCTF Ezpop_Revenge小记

    前言 一道typecho1.2的反序列化,顺便记录一下踩的坑 www.zip获得源码,结构大致如下 flag.php需要ssrf,如果成功会写入session 拿到源码直接去网上先找了一下有没有现成的 ...

  10. .NET Core 3 WPF MVVM框架 Prism系列之对话框服务

     本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的对话框服务,这也是prism系列的最后一篇完结文章,下面是Prism系列文章的索引: .NET Core 3 WPF MVVM框 ...