数组不是指针,指针也不是数组,这是两个不同的东西,只是在某些场合下,可以进行相似的操作。

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]相关推荐

  1. char*,const char*,string的相互转换 C++

    转:https://www.cnblogs.com/wxmdevelop/p/4567857.html string转const char* string s ="abc"; co ...

  2. char str[]与char *str的区别

    一个具体例子: main() {char *p="abc123ABC";//char p[]="abc123ABC"int i=0;while(*(p+i)!= ...

  3. char s []和char * s有什么区别?

    在C语言中,可以在这样的声明中使用字符串文字: char s[] = "hello"; 或像这样: char *s = "hello"; 那么区别是什么呢? 我 ...

  4. 无法从“const char [10]”转换为“char *”

    无法从"const char [10]"转换为"char *" 解决方法: 项目属性  c++--> 语言-->  符合模式->> 选择 ...

  5. C++中const char*, string 与char*的转化

    C++中const char*, string 与char*的转化 原文:https://blog.csdn.net/zhang_alongzd/article/details/52790905 版权 ...

  6. char[]数组与char *指针的区别

    char[]数组与char *指针的区别 问题描述 虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了 ...

  7. 【错误记录】Android NDK 编译报错 ( no known conversion from ‘unsigned char *‘ to ‘const char *‘ )

    文章目录 一.报错信息 二.解决方案 一.报错信息 在 Visual Studio 2019 中编译 Android NDK , 构建方式参考 [Android 逆向]Android 进程注入工具开发 ...

  8. 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 ...

  9. char s[] 和 char *s 的区别

    第一种: char *a 与char a[] 的区别 char *d = "hello" 中的a是指向第一个字符'a'的一个指针:char s[20] = "hello& ...

最新文章

  1. mybatis mapper.xml --注释 带参数的坑
  2. The maximum string content length quota (8192) has been exceeded while reading XML data
  3. JSP生成静态HTML页面的实践方法和设计思路
  4. 迁移Azure web site实践 (三),Azure web site迁移
  5. 小议SqlMapConfig.xml配置文件
  6. 论文浅尝 | 通过共享表示和结构化预测进行事件和事件时序关系的联合抽取
  7. java第三方登录接口_第三方登录接入-qq,weibo-java
  8. 语音识别准确率终于提升了 以后可以随时和机器人聊天
  9. Ubuntu 14.04 安装 DevStack与遇到的的问题记录
  10. windows补丁下载地址
  11. Mac锁屏设置快捷键
  12. 关于Altium Designer的BOM,元件清单
  13. Oracle SQL
  14. 三位数求解:已知xyz+yzz=n,其中n是一个正整数,x、y、z都是数字(0-9),编写一个程序求出x、y、z分别代表什么数字。若无解,则输出“No Answer” 注意:xyz和yzz表示一个三
  15. 嵌入式技术与应用专业毕业以后可以做什么?
  16. PHP Class - 图片水印
  17. Bootstrap4文件上传控件美化
  18. CorelCAD 2019.5 v19.1.1.2035破解版下载【Win+Mac+注册机】
  19. 求值:空间向量的法向量
  20. linux apache 404配置文件,apache httpd服务器404错误跳转配置教程

热门文章

  1. SpringBoot 自动解析参数:HandlerMethodArgumentResolver
  2. html编写的过程中,为什么font设置属性的时候,第二个属性不起作用
  3. day3 集合、文件操作、函数、局部变量
  4. Tensorflow |(5)模型保存与恢复、自定义命令行参数
  5. kml 解析 java_KML文件解析显示在地图
  6. 面向生信分析的高性 RStudio 服务器
  7. MPB:农科院牧医所赵圣国组-基于GraftM对功能基因进行物种注释
  8. 微生物生态期刊Soil Biology and Biochemistry(SBB)简介
  9. 微生物所科学家建成小鼠肠道微生物资源库
  10. QIIME 2用户文档. 22Python命令行模式(2019.7)