char *p 与char p[N]
数组不是指针,指针也不是数组,这是两个不同的东西,只是在某些场合下,可以进行相似的操作。
char a[10] = "Hello";
char *p = "World";
a和p在内存分别是这样的
可以看出,p是一个指针,其内容指向一个数组;a就是数组本身;
再看操作上的不同
1、对于sizeof操作符来说,char *p结果是指针大小,我的机器是8; char p[10]结果是数组大小,是10。
2、对&(取地址)操作符而言,得到的结果不一样,a = &a = &a[0],这三个数值都一样,但是类型不一样,&a是数组指针char (*)[10],&a[0]是指向第一个元素的指针,是char *; p != &p,p最为一个变量,本身需要内存存放,这个地址是p本身,&p获取p本身的地址,类型是char **,p存放的值为指向的数组首址,所以p != &p
void func(char (*p)[10]);
func(&p); // error
func(&a); // ok
3、编译器对两者的处理不同,即访问a和p(不是内容),产生的汇编不同,具体后补
为什么会说指针和数组一样呢,这是因为在指针代数运算、数组下标运算和数组作为参数传递给函数的时候,数组会退化生成指向第一个元素的指针。p[2] => *(p + 2), a[2] => *(a + 2),在这里看起来是等价的,而且还有诡异的写法3[p], 4[a]都是合法表达式,因为都会被转换成指针运算。
其实这两货没有什么区别,都是一个字符串开头地址,特别是传参数用char *p和 char p[1]完全是一样的东西,当然了,你用char *p是没有分配内存的,而char p[N]会分配N字节的内存
C++使用指针来处理数组的,所以就有了数组名是指向数组第一个元素指针的值,凡是数组的地方换为指针没问题,利用指针运算,但是,指针的地方,不一定可以换成数组处理方式,只有指针指向了数组,才可以换,所以char[]和char*就好理解了,第一个做形参的时候,表明这是数组,当然可以换成后者,但是后者做形参,得看看主调函数传的实参是不是数组指针,是的话,也可以等价互换,不然绝对不可以!
char *p 与char p[N]相关推荐
- char*,const char*,string的相互转换 C++
转:https://www.cnblogs.com/wxmdevelop/p/4567857.html string转const char* string s ="abc"; co ...
- char str[]与char *str的区别
一个具体例子: main() {char *p="abc123ABC";//char p[]="abc123ABC"int i=0;while(*(p+i)!= ...
- char s []和char * s有什么区别?
在C语言中,可以在这样的声明中使用字符串文字: char s[] = "hello"; 或像这样: char *s = "hello"; 那么区别是什么呢? 我 ...
- 无法从“const char [10]”转换为“char *”
无法从"const char [10]"转换为"char *" 解决方法: 项目属性 c++--> 语言--> 符合模式->> 选择 ...
- C++中const char*, string 与char*的转化
C++中const char*, string 与char*的转化 原文:https://blog.csdn.net/zhang_alongzd/article/details/52790905 版权 ...
- char[]数组与char *指针的区别
char[]数组与char *指针的区别 问题描述 虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了 ...
- 【错误记录】Android NDK 编译报错 ( no known conversion from ‘unsigned char *‘ to ‘const char *‘ )
文章目录 一.报错信息 二.解决方案 一.报错信息 在 Visual Studio 2019 中编译 Android NDK , 构建方式参考 [Android 逆向]Android 进程注入工具开发 ...
- GetMemeory(char *p);GetMemeory(char **p);char* GetMemeory()用法!
void GetMemeory(char *p) {p=(char*)malloc(100); }void main() {char *str=NULL;GetMemory(str);strcpy(s ...
- char s[] 和 char *s 的区别
第一种: char *a 与char a[] 的区别 char *d = "hello" 中的a是指向第一个字符'a'的一个指针:char s[20] = "hello& ...
最新文章
- mybatis mapper.xml --注释 带参数的坑
- The maximum string content length quota (8192) has been exceeded while reading XML data
- JSP生成静态HTML页面的实践方法和设计思路
- 迁移Azure web site实践 (三),Azure web site迁移
- 小议SqlMapConfig.xml配置文件
- 论文浅尝 | 通过共享表示和结构化预测进行事件和事件时序关系的联合抽取
- java第三方登录接口_第三方登录接入-qq,weibo-java
- 语音识别准确率终于提升了 以后可以随时和机器人聊天
- Ubuntu 14.04 安装 DevStack与遇到的的问题记录
- windows补丁下载地址
- Mac锁屏设置快捷键
- 关于Altium Designer的BOM,元件清单
- Oracle SQL
- 三位数求解:已知xyz+yzz=n,其中n是一个正整数,x、y、z都是数字(0-9),编写一个程序求出x、y、z分别代表什么数字。若无解,则输出“No Answer” 注意:xyz和yzz表示一个三
- 嵌入式技术与应用专业毕业以后可以做什么?
- PHP Class - 图片水印
- Bootstrap4文件上传控件美化
- CorelCAD 2019.5 v19.1.1.2035破解版下载【Win+Mac+注册机】
- 求值:空间向量的法向量
- linux apache 404配置文件,apache httpd服务器404错误跳转配置教程
热门文章
- SpringBoot 自动解析参数:HandlerMethodArgumentResolver
- html编写的过程中,为什么font设置属性的时候,第二个属性不起作用
- day3 集合、文件操作、函数、局部变量
- Tensorflow |(5)模型保存与恢复、自定义命令行参数
- kml 解析 java_KML文件解析显示在地图
- 面向生信分析的高性 RStudio 服务器
- MPB:农科院牧医所赵圣国组-基于GraftM对功能基因进行物种注释
- 微生物生态期刊Soil Biology and Biochemistry(SBB)简介
- 微生物所科学家建成小鼠肠道微生物资源库
- QIIME 2用户文档. 22Python命令行模式(2019.7)