Character Array and Character Pointer
最近复习数据结构实验时,碰到这么一行代码,看的有点不爽。
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的更多相关文章
- Matlab一个错误引发的血案:??? Error using ==> str2num Requires string or character array input.
Matlab总遇到一些神奇的问题,让人摸不着头脑.昨天编写程序的时候遇到一个让我十分火大的问题,也是自己的matlab基础不好吧. 先描述一下问题,再GUI界面有个listbox,Tag属性是’lis ...
- Convert character array to string in MATLAB
Matlab提取特征值是经常要读取多个图片文件,把文件名保存在数组中后再读取会出错.从stackoverflow中找到如下解决方法: I've a M by N matrix, each cell c ...
- Java基础知识强化68:基本类型包装类之Character概述和Character常见方法
1. Character概述: public final class Character extends Object implements Serializable,Comparable<Ch ...
- MATLAB知识-解决因缺少libsvm 而运行出现Y must be a vector or a character array.
matlab版本R2014b 最近运行一个使用svmtrain的程序,出现以下错误: 这是因为是在设定路径里面没有libsvm.辛亏有一位师姐的电脑里面有libsvm的包,我直接用了,这样就不需要下载 ...
- Multi-Byte Character Set & Unicode Character Set
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49592361 编程时遇到BUG:err ...
- [转]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 ...
- [转]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 ...
- 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 ...
- Java.lang.Character类
Character将一个char基本数据类型封装在类中.这个类中只有一char类型的变量.Character是基于unicode码进行的Character所有的方法,都是围绕着这个char基本数据类型 ...
随机推荐
- Vulnhub JIS-CTF-VulnUpload靶机渗透
配置问题解决 参考我的这篇文章https://www.cnblogs.com/A1oe/p/12571032.html更改网卡配置文件进行解决. 信息搜集 找到靶机 nmap -sP 192.168. ...
- 如何在云开发静态托管中使用Hugo
如何在云开发静态托管中使用Hugo 介绍 hugo是一个用Go编写的静态站点生成器,由于具有丰富的主题资源和有比较丰富的主题资源和较好的生成速度. 云开发(CloudBase)是一款云端一体化的产品方 ...
- Python之 module安装
如出现这种错误 ModuleNotFoundError: No module named 'numpy' 这种错误通常不会出现,因为Python的模块,通常在你安装Python shell的时候,就已 ...
- Linux C++ 网络编程学习系列(6)——多路IO之epoll高级用法
poll实现多路IO 源码地址:https://github.com/whuwzp/linuxc/tree/master/epoll_libevent 源码说明: server.cpp: 监听127. ...
- ConcurrentHashMap 同步安全 的真正含义(stringbuff 是同步安全的,stringbutter 不安全)
同步安全的集合,在多线程下用到这个map是安全的,但这个安全指的是什么?线程安全指的是指get.remove.put等操作时即同一对象,同一时间只有一个线程能在这几个方法上运行,也就是说线程安全是在这 ...
- 自己总结 :并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别 和 使用场景总结
并发队列ConcurrentLinkedQueue.阻塞队列AraayBlockingQueue.阻塞队列LinkedBlockingQueue 区别 和 使用场景总结 分类: Java2013-0 ...
- Fiddler 内置命令与断点
Fiddler还有一个藏的很深的命令框,就是眼前,我用了几年的Fiddler都没有发现它,偶尔在别人的文章发现还有这个小功能,还蛮好用的,整理下记录在这里. FIddler断点功能就是将请求截获下来, ...
- 003-scanf函数使用和表达式-C语言笔记
003-scanf函数使用和表达式-C语言笔记 学习目标 1.[掌握]输入函数scanf的基本使用方法 2.[掌握]输入函数scanf运行原理和缓冲区理解 3.[掌握]算术运算符和算术表达式的使用 4 ...
- C语言二维数组超细讲解
用一维数组处理二维表格,实际是可行的,但是会很复杂,特别是遇到二维表格的输入.处理和输出. 在你绞尽脑汁的时候,二维数组(一维数组的大哥)像电视剧里救美的英雄一样显现在你的面前,初识数组的朋友们还等什 ...
- Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述
Spark SQL模块,主要就是处理跟SQL解析相关的一些内容,说得更通俗点就是怎么把一个SQL语句解析成Dataframe或者说RDD的任务.以Spark 2.4.3为例,Spark SQL这个大模 ...